收藏 分享(赏)

MFC学习笔记.doc

上传人:weiwoduzun 文档编号:5730759 上传时间:2019-03-15 格式:DOC 页数:87 大小:393.50KB
下载 相关 举报
MFC学习笔记.doc_第1页
第1页 / 共87页
MFC学习笔记.doc_第2页
第2页 / 共87页
MFC学习笔记.doc_第3页
第3页 / 共87页
MFC学习笔记.doc_第4页
第4页 / 共87页
MFC学习笔记.doc_第5页
第5页 / 共87页
点击查看更多>>
资源描述

1、第一课1.MFC 生成的 C+源文件中都有 StdAfx.h,此文件包含了常用的 AFX 函数的声明,其中有afxwin.h,此文件包含了 CRECT,CPoint,CWnd 等许多类及其方法的声明。2.Project-Setting-Debug 可以加入命令行参数。3.在 SDK 中要加入 “windows.h“和 stdio.h。因为 LoadCursor,MessageBox 等函数的声明在这个文件中。4.创建一个完整的窗口的四个步骤 SDK,1 设计窗口类,2 注册窗口类,3 创建窗口,4 显示窗口5.函数名可以代表函数代码的首地址,即可作为函数指针。6.要查看 VC 数据类型,可以在

2、 MSDN 中输入“BOOL ”然后选择“DATA TYPE” 。7.atof 将字符串转化为 float,atoi 将字符串转化为 int 型。8.所有从 CWnd 类派生的类都有 m_hWnd 句柄。9.变量的生命周期:可以认为出了包含它的大括号,这个变量的生命周期结束。所以全局变量的声明位于所有大括号之外。但是用 new 声明的变量和用 static 声明的变量除外。10.SDK 示范程序,见下面。11.sprintf 格式化字符,其头文件为 stdio.h,在 MFC 中格式化字符用 CString.Format12.GetDC()与 ReleaseDC()要成对使用,否则会内存泄漏。

3、同样, BeginPaint()与 EndPaint()。13.GetStockObject()得到画笔、画刷、字体、调色板的句柄,使用时必须用类型转换。14.什么时候用 NULL,什么时候用 0.答,对指针赋值时用 NULL,对变量赋值时用 0.15.什么是野指针?答:将指针指向的变量的内存释放后,此指针即变成野指针!如何避免野指针?答:将此指针指向 NULL 即可。p=NULL;16.SDK 代码流程:#include “windows.h“/包含头文件 LoadCursor,TextOut 等函数#include “stdio.h“/包含 sprintf,printf 等函数LRESUL

4、T CALLBACK MyProc(.);/声明回调函数int WINAPI WinMain()WNDCLASS wndcls;/设计窗口类wndcls.hcursor=LoadCursor();/初始化RegisterClass(/注册窗口类hwnd=CreateWindow(.);/创建窗口ShowWindow();/显示窗口UpdateWindow();MSG msg;/定义消息结构体while(GetMessage(.)/消息循环.return 0;LRESULT CALLBACK MyProc(.)/实现回调函数switch(uMsg)case WM_CHAR:break;.第 2

5、课1.定义结构体和类时别忘记在最后加入“;“ 号!例如 Class Pointint x;int y;2.#include 与#include “xxx.h“的区别:Initinstance();/初始化工作和注册窗口类,窗口显示和更新pThread-Run();/消息循环而在 BOOL CTestApp:InitInstance()中的代码CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CTestDoc),RUNTIME_CLASS(CMain

6、Frame), / main SDI frame windowRUNTIME_CLASS(CTestView);AddDocTemplate(pDocTemplate);完成了将这三个类关联起来的工作。4.如何在单文档文件中显示一个 CButton 的对象?在 CMainFrame:OnCreate()中定义一个 CButton 的对象 btn;然后调用 btn.Create(“维新“,WS_DISABLED |WS_CHILD | WS_VISIBLE | BS_AUTO3STATE,CRect(0,0,300,100),/*GetParent(),*/this,123);注意点:(1).此

7、处 btn 不能是局部变量,否则它的生命周期太短,将不能显示。(2).在 create 函数的第二个参数中加入 WS_VISIBLE 参数才行。否则必须调用ShowWindow也可以在 view 的 OnCreate 消息响应函数中加入(3).CButton 类的定义头文件在 afxwin.h 中,而 stdafx.h 包含了 afxwin.h,所以可以直接使用。因为 MFC 中的每一个类中都有#include “stdafx.h“的声明。第 4 课1.在单文档中 view 挡在 MainFrame 的前面。此时如果编写针对 MainFrame 的 mouseClick事件,将不会有反应。2.

8、消息响应会在 3 处修改代码,1 处是在头文件中,/AFX_MSG(CDrawView)afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void OnMouseMove(UINT nFlags, CPoint point);/AFX_MSGDECLARE_MESSAGE_MAP()另一处是 cpp 文件的 begin MessageMap 和 End MessageMap 之间,BEGIN_MESSAGE_MAP(C

9、DrawView, CView)/AFX_MSG_MAP(CDrawView)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MA

10、P()最后是要有函数实现的代码。void CDrawView:OnLButtonDown(UINT nFlags, CPoint point) / TOD Add your message handler code here and/or call defaultm_ptOrigin=m_ptOld=point;m_bDraw=TRUE;CView:OnLButtonDown(nFlags, point);3.画线:定义一个成员变量保存 mouseDown 的点 m_Point1)API 函数方法画线用 HDC2)用 CDC 类成员函数画线。此时别忘记 ReleaseDC3)用 CClient

11、DC4)用 CWindowDC,用它甚至可以整个屏幕区域画线。下面是上面 4 种方法的代码/*HDC hdc;hdc=:GetDC(m_hWnd);MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);LineTo(hdc,point.x,point.y);:ReleaseDC(m_hWnd,hdc);必须成对使用。*/*CDC *pDC=GetDC();pDC-MoveTo(m_ptOrigin);pDC-LineTo(point);ReleaseDC(pDC);必须成对使用。*/CClientDC dc(this);/*CClientDC dc(GetP

12、arent();dc.MoveTo(m_ptOrigin);dc.LineTo(point);此处不需要 ReleaseDC,因为 CClientDC 会自动释放 DC*/CWindowDC dc(this);/CWindowDC dc(GetParent();/*CWindowDC dc(GetDesktopWindow();/此时可以在整个屏幕上画线。dc.MoveTo(m_ptOrigin);dc.LineTo(point);*/*CPen pen(PS_DOT,1,RGB(0,255,0);CClientDC dc(this);CPen *pOldPen=dc.SelectObject

13、(dc.MoveTo(m_ptOrigin);dc.LineTo(point);dc.SelectObject(pOldPen);*/5)用 Bitmap 填充所画的矩形。CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1);CBrush brush(CClientDC dc(this);dc.FillRect(CRect(m_ptOrigin,point),/CBRUSH:FromHandle 是静态成员函数,所以可以用下面的方法调用。CBrush *pBrush=CBrush:FromHandle(HBRUSH)GetStockObject(NULL_

14、BRUSH);CBrush *pOldBrush=dc.SelectObject(pBrush);dc.Rectangle(CRect(m_ptOrigin,point);dc.SelectObject(pOldBrush);m_bDraw=FALSE;6)用其它颜色画线CClientDC dc(this);CPen pen(PS_SOLID,1,RGB(255,0,0);CPen *pOldPen=dc.SelectObject(/选中红色画笔if(m_bDraw=TRUE)dc.SetROP2(R2_BLACK);/设置绘画模式dc.MoveTo(m_ptOrigin);/dc.LineT

15、o(point);dc.LineTo(m_ptOld);/dc.MoveTo(m_ptOrigin);dc.MoveTo(m_ptOld);dc.LineTo(point);/m_ptOrigin=point;m_ptOld=point;dc.SelectObject(pOldPen);4.MFC 中隐式的包含了 windows.h。为什么?因为在 AFXV_W32.h 文件中:/ This is a part of the Microsoft Foundation Classes C+ library./ Copyright (C) 1992-1998 Microsoft Corporati

16、on/ All rights reserved.在 AFXWIN.h 中/ Note: WINDOWS.H already included from AFXV_W32.H5.如何从句柄获得对象的指针?答 FromHandle6.类的静态成员函数可以由类名直接调用,也可以由对象调用。可以认为静态成员函数并不属于某个对象,它属于类本身。程序运行伊始,即使没有实例化类的对象,静态成员函数和静态成员变量已然有其内存空间。静态成员函数不能访问非静态成员变量!静态成员变量必须在类的外部初始化。当然如果并不打算用到静态成员变量,此时你可以不初始它。7.理解代码区,数据区,堆,栈!请见下面的简介:http:

17、/ 3 个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈” 。 “栈(stack)”和“ 堆(heap) ”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈” ,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。 8.抽空看看李维的悟透 Delphi有一回,我梦见自己变成了计算机时空世界里的一个对象。随着计算机世界的不断发展,我们这些对象已经不再象原始时代的对象那样仅仅为

18、了获得生存的资源而不停的忙碌。我们的思想空前活跃,我门不但思考我们为什么要在计算机世界里生存和运行,而且还大胆的研究和探索计算机世界的未知奥秘。我们已经知道整个计算机世界都是由字节这一基本粒子构成,而字节又是由八个更细小的位粒子构成;我们还知道物质不灭定律,即任何一个对象的灭亡,只意味着对象结构的解体,并不会减少计算机世界中的任何字节或位粒子,而着这些物质又可能成为别的对象的一部分;甚至,我们还知道我们所处的世界是一个球体,因为,在越过经度$FFFFFFFF 又回到了原点$00000000 的位置。著名的物理学家对象牛顿早就发现各种对象之间存在一种普遍的联系,并且在对象的运动速度与对象大小的关

19、系方面提出了著名的理论-牛顿力学。可是,后来牛顿这个对象却一直搞不懂到底是什么力量在无形地推动各种对象的运动。因此,他认为一定是创造整个计算机世界的上帝在推动各种对象的运动。后来他成了上帝最虔诚的信徒。在牛顿对象死后不久,我们的计算机世界又诞生了一个更伟大的对象。他基于先有代码的执行才有执行的结果这一基本的因果论,提出了进程运动的时空是相对的这一伟大理论。他认为,在一个运动中进程空间中看另一个运动中的进程空间,时间和空间都不是绝对的,空间会弯曲。而且,任何对象的运动速度绝对不可能超过 CPU 的速度,CPU 速度就是我们计算机世界里的光速。这位伟大的科学对象的名字就叫爱因斯坦,他的相对论在一开

20、始是不被对象们理解的,可是后来的科学探索都证明了这一理论的正确性。他提出的代码能量和数据物质可以相互转换的理论,也后来制造的大规模毁灭性病毒核武器中得到验证。在梦的世界里,我快乐极了。我一会儿变一变我的属性,一会儿又动动我的方法,一会儿感受一下外来的事件。没错,我确实就是一个实实在在的对象!过了一会我突然明白,我本来就是一个对象,只是这个对象在梦中变成了现实世界的我哈哈!align=rightcolor=#000066此贴子已经被作者于 2006-3-1 20:03:14 编辑过/color/align资料 发消息 回复 引用 推荐 收藏 顶楼 虎非龙 昵称:虎非龙 专家等级:学员 专家分:5

21、00 可用分等级:佃户 精华:0 帖子数:370 结帖率: 100% 注册时间:2004-07-11 23:28:00 发表于 2006-03-03 23:01:00 第 5 楼 第 5 课1.CWnd:CreateSolidCaret 创建插入符, ShowCaret()显示插入符。GetTextMetrics(),获得当前字体的一些信息。CWnd:CreateCaret() 创建图象插入符bitmap.LoadBitmap(IDB_BITMAP1);/此处的 bitmap 为成员变量!CreateCaret(ShowCaret();TEXTMETRIC tm;/字体结构体dc.GetTex

22、tMetrics(/m_ptOrigin.y+=tm.tmHeight;/获得字体高度。2.VC 中 CString:LoadString(ID 号) ,比较方便。3.路径层的概念:有两种方法创建路径层:(1)pDC-BeginPath();pDC-Rectangle(50,50,50+sz.cx,50+sz.cy);pDC-EndPath();pDC-SelectClipPath(RGN_DIFF);(2)CSize sz=pDC-GetTextExtent(str);CRgn rn;rn.CreateRectRgn(0,50,sz.cx,sz.cy);pDC-SelectClipRgn(路

23、径层有什么作用?可以保护我们先前的文本或者图像不被后来画的覆盖。4.在 View 上输入文字的步骤。CFont font;/创建字体对象font.CreatePointFont(300,“华文行楷“,NULL);/设置CFont *pOldFont=dc.SelectObject(/将字体选择到 DC 中TEXTMETRIC tm;/创建字体信息对象dc.GetTextMetrics(/获得当前字体信息if(0x0d=nChar)/处理回车键m_strLine.Empty();m_ptOrigin.y+=tm.tmHeight;else if(0x08=nChar)/处理退格键COLORREF

24、 clr=dc.SetTextColor(dc.GetBkColor();dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);m_strLine=m_strLine.Left(m_strLine.GetLength()-1);dc.SetTextColor(clr);elsem_strLine+=nChar;CSize sz=dc.GetTextExtent(m_strLine); CPoint pt;/处理光标的位置pt.x=m_ptOrigin.x+sz.cx;pt.y=m_ptOrigin.y; SetCaretPos(pt);dc.TextO

25、ut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);/输出字体 dc.SelectObject(pOldFont);/将原先的字体选择回去。5.模拟卡啦 OK 变色的步骤。(1)设置定时器(2)在定时器中加入如下代码/DEL m_nWidth+=5;/此为 view 的成员变量,初始值为 0/DEL /DEL /DEL CClientDC dc(this);/DEL TEXTMETRIC tm;/DEL dc.GetTextMetrics(/DEL CRect rect;/DEL rect.left=0;/DEL rect.top=200;/DEL rect.rig

26、ht=m_nWidth;/DEL rect.bottom=rect.top+tm.tmHeight;/此长方形的长度随着定时器的触发,逐渐增大/DEL /DEL dc.SetTextColor(RGB(255,0,0);/DEL CString str;/DEL str.LoadString(IDS_WEIXIN);/DEL dc.DrawText(str,rect,DT_LEFT);此函数的作用是将字符串输出到长方形中,但如果字符串的长度超过长方形的长度,多余的字符将被截断/DEL /DEL rect.top=150;/DEL rect.bottom=rect.top+tm.tmHeight

27、;/DEL dc.DrawText(str,rect,DT_RIGHT);/DEL /DEL CSize sz=dc.GetTextExtent(str);获得字符串的长度/DEL if(m_nWidthsz.cx)当长方形的长度大于字符串的长度后,将其重新归 0/DEL /DEL m_nWidth=0;/DEL dc.SetTextColor(RGB(0,255,0);/DEL dc.TextOut(0,200,str);/DEL /DEL /DEL CView:OnTimer(nIDEvent);6.SetTimer 也可以用回调函数来操作,但并不方便。以下是步骤(1) 在 View 的

28、OnCreate 消息响应函数中:SetTimer(1,1000,Timer2Proc);(2) 回调函数的实现:void CALLBACK EXPORT Timer2Proc(HWND hWnd, / handle of CWnd that called SetTimerUINT nMsg, / WM_TIMERUINT nIDEvent, / timer identificationDWORD dwTime / system time)/ MessageBox(CMainFrame *)AfxGetMainWnd()-m_hWnd),“ddfaf“,“weixin“,0);CMainFra

29、me *pMain=(CMainFrame *)AfxGetApp()-m_pMainWnd;/获得 MainFrame 的指针CTextView *pView=(CTextView *)pMain-GetActiveView();/获得 view 的指针CClientDC dc(pView);/构造 DCdc.TextOut(333,222,“hello world“);/我们可以看出,使用回调函数时要获得窗口或者 APP的指针,给我们的操作带来麻烦。并不方便。第 6 课1.当对某菜单添加消息响应函数时,4 个类的消息响应优先次序分别是:1.View;2.CDOC;3.CMainFrame.

30、4.CWinAPP.为什么?请参阅 深入浅出2.消息分类:a;标准消息(以 WM_开头的消息,但不包括 ON_COMMAND) ;b;命令消息 ON_COMMAND(IDM_PHONE1, OnPhone1),菜单和工具栏的消息。c. 通告消息:按钮,列表框发出的消息。CCmdTarget 只能接受命令消息。而从 CCmdTarget 派生的 CWnd 可以接收命令消息,也可以接受标准消息。3.确定菜单的索引号,注意从 0 开始,分隔符也算数。什么叫弹出菜单(Popup Menu)? 一个子菜单只能有一个缺省菜单。 /GetMenu()-GetSubMenu(0)-SetDefaultItem

31、(5,TRUE);str.Format(“x=%d,y=%d“,GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK);/获得系统的菜单的位图的大小。/* SetMenu(NULL);/移除菜单 CMenu menu;menu.LoadMenu(IDR_MAINFRAME);SetMenu(menu.Detach();*/增加菜单,此处 detach(),如果是局部变量。4.void CMainFrame:OnUpdateEditCut(CCmdUI* pCmdUI) if(2=pCmdUI-m_nIndex)pCmd

32、UI-Enable();/当此菜单显示时,设为可用。5.右键弹出菜单功能的实现方法有两个:a.Project-Add to Project-component and controls-文件夹 VC components-Popup Menu OKb.用 TrackPopupMenu()实现。CMenu menu;menu.LoadMenu(IDR_MENU1);CMenu *pPopup=menu.GetSubMenu(0);ClientToScreen(pPopup-TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point

33、.y,GetParent();6.动态创建菜单的方法: CMenu menu;menu.CreatePopupMenu();/ GetMenu()-AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,“WinSun“);GetMenu()-InsertMenu(2,MF_BYPOSITION | MF_POPUP,(UINT)menu.m_hMenu,“WinSun“);menu.AppendMenu(MF_STRING,IDM_HELLO,“Hello“);menu.AppendMenu(MF_STRING,112,“Weixin“);menu.AppendMenu

34、(MF_STRING,113,“Mybole“);menu.Detach();GetMenu()-GetSubMenu(0)-AppendMenu(MF_STRING,114,“Welcome“);GetMenu()-GetSubMenu(0)-InsertMenu(ID_FILE_OPEN,MF_BYCOMMAND | MF_STRING,115,“维新“);/ GetMenu()-DeleteMenu(1,MF_BYPOSITION);/ GetMenu()-GetSubMenu(0)-DeleteMenu(2,MF_BYPOSITION);7.为动态创建的菜单增加消息响应的步骤a.在 r

35、esource.h 中增加#define IDM_HELLO 123b.在 MainFrm.h 中加入 afx_msg void OnHello();c.MainFrm.cpp 中加入 ON_COMMAND(IDM_HELLO,OnHello)d.最后加入void CMainFrame:OnHello()MessageBox(“Hello!“);8.动态增加电话号码本步骤a.处理 WM_Char 消息。如果回车,则清空字符串,窗口重绘 invalidate,将人名加入到菜单中,将字符串保存集合类 CStringArray 中,用的是成员函数 Add 方法。b.取出动态创建的菜单的数据的方法。1

36、)创建一个弹出菜单,弹出菜单下面有 4 个子菜单。将子菜单的 ID 号连续。2)在 resource.h 中添加#define IDM_PHONE1 1233)添加其消息响应函数。注意注释中的文字BEGIN_MESSAGE_MAP(CMenu2View, CView)/AFX_MSG_MAP(CMenu2View)ON_WM_CHAR()ON_COMMAND(ID_EDIT_COPY, OnEditCopy)/下面的 4 句代码原来在此处。/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(IDM_PHONE1, OnPhone1)/一定要这

37、4 句代码移到此处。ON_COMMAND(IDM_PHONE2, OnPhone2)ON_COMMAND(IDM_PHONE3, OnPhone3)ON_COMMAND(IDM_PHONE4, OnPhone4)ON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()4)填写代码9.如何在 MainFrame 中

38、拦截 OnCommand 消息?答,在它增加 OnCommand 的消息处理函数即可。10.错误调试方法:Missing “;“ before “*“CMenu2Doc* GetDocument();/因为 CMenu2Doc 是个不认识的变量,将其头文件包含进即可。第 7 课1.如果在 SDI 中要调用对话框a.先插入一个对话框资源;b.然后在 ClassWizards 中为其创建一个类。其目的是比较方便为添加按纽和消息响应函数。c.然后实例化它。在实例化时,必须将其头文件包含进去。2.创建非模态对话框,注意它不能是局部变量。当 点击非模态对话框的 OnOK 按纽时,它并没有关闭,而是隐藏了

39、。需要调用 destroyWindow().3.一个对象只能一个按纽。为什么?因为在 Wincore.cpp 的 628 行有代码 ASSERT(pWnd-m_hWnd = NULL); / only do once 而创建后它的 m_hWnd 就不为 0 了。此处 ASSERT的用法是如果括号里面不为真,则程序崩溃。4.如何为静态文本框增加消息响应?首先将 IDC_STATIC 改名。同时还需要将 Notify 特性复选中。5.完成加法功能。a.GetDlgItem();b.GetDlgItemText();c.GetDlgItemInt();d.将 IDC_EDIT1 关联 CEDIT 类

40、型变量e.将 IDC_EDIT1 关联 int 型变量。注意调用 UpdateData();f. /:SendMessage(GetDlgItem(IDC_EDIT1)-m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);/:SendMessage(m_edit1.m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);/GetDlgItem(IDC_EDIT1)-SendMessage(WM_GETTEXT,10,(LPARAM)ch1);m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1);g. SendDlgItemMe

41、ssage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,(LPARAM)ch2);6.点击按纽改变窗口尺寸if(GetDlgItemText(IDC_BUTTON2,str),str=“收缩“);static CRect rectLarge;static CRect rectSmall;if(rectLarge.IsRectNull()CRect rectSeparator;GetWindowRect(GetDlgItem(IDC_SEPARATOR)-GetWindowRect

42、( rectSmall.left=rectLarge.left;rectSmall.top=rectLarge.top;rectSmall.right=rectLarge.right;rectSmall.bottom=rectSeparator.bottom;if(str=“收缩SetFocus(:GetNextDlgTabItem(:GetParent(hwnd),hwnd,FALSE);return 1;elsereturn prevProc(hwnd,uMsg,wParam,lParam);BOOL CTestDlg:OnInitDialog() CDialog:OnInitDialog

43、();/ TOD Add extra initialization hereprevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)-m_hWnd,GWL_WNDPROC,(LONG)WinSunProc);/设置回调函数return TRUE; / return TRUE unless you set the focus to a control/ EXCEPTION: OCX Property Pages should return FALSE方法 2:在 OnOK 响应函数中加入代码/GetDlgItem(IDC_EDIT1)-GetNe

44、xtWindow()-SetFocus();/GetFocus()-GetNextWindow()-SetFocus();/GetFocus()-GetWindow(GW_HWNDNEXT)-SetFocus();GetNextDlgTabItem(GetFocus()-SetFocus();第 8 课 对话框1.如何改变按纽的字体?在对话框的属性中改变字体的属性即可2.逃跑按纽的实现1.从 CButton 派生一个类,CWeixinBtn2.将 IDC_EDIT1 关联成员变量 m_btn1,类型为 CWeixinBtn,注意要包含头文件。3.在 CWeixinBtn 中加一个指针成员变量

45、CWeixinBtn *pWeixinBtn,然后将其地址初始化。4.在新类中增加鼠标移动的消息处理。3.属性表单1.插入属性页资源。Insert-new Resource-Dialog2.当选择 Classwizard 菜单时,系统提示是否为创建新的类,我们将其从 CPropertyPage派生!这样可以为方便为其增加消息响应函数。3.插入新的从 CPropertySheet 派生的类,在类中增加 3 个 CPropertyPage 的实例。4.在 view 中增加菜单项,当点击时显示属性表单,出现中文乱码,修改 CPropertyPage属性为中文,另外将其字体设为宋体。5.在 CProp

46、ertyPage 中设置 SetWizardButtons 可将其属性改为上一步、完成!6.为 IDC_RADIO1 关联成员变量,需要先设置 Group 属性才行。另外别忘记调用UpdateData().7.为 CPropertyPage 增加虚函数,OnWizardNext,如果用户点击下一步时,不想让他进入下一步,刚返回-1!8.将用户的选择输出到屏幕上,此时可以在 View 中增加几个成员变量,用来接收用户选择的数据。4.memset()的用法! memset(m_bLike,0,sizeof(m_bLike);第 9 课1.修改外观和图标可以在 MainFrm 中进行,而修改背景和光

47、标只能在 View 中进行。为什么?因为 view 的显示挡在了 MainFrame 的前面。a.在 MainFrame 中PreCreateWindow()中,在窗口创建之前,用重新注册窗口类的方法,比较麻烦。在PreCreateWindow()中修改也可以用简单的方法,用全局函数/cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,0,0,/ LoadIcon(NULL,IDI_WARNING);在窗口创建之后,在 OnCreate()中修改/SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPE

48、DWINDOW);/SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) / SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR);b.在 View 中PreCreateWindow()中/cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,/ LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),NULL);cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);OnCreate()中SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH);SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_HELP);2.创建一个不断变化的图标。用定时器和 SetClassLong 完成a.准备三个图标文件,放在 RES

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报