VC++MFC编程实例实用教案

上传人:莉**** 文档编号:60397250 上传时间:2022-03-07 格式:PPTX 页数:139 大小:1.36MB
收藏 版权申诉 举报 下载
VC++MFC编程实例实用教案_第1页
第1页 / 共139页
VC++MFC编程实例实用教案_第2页
第2页 / 共139页
VC++MFC编程实例实用教案_第3页
第3页 / 共139页
资源描述:

《VC++MFC编程实例实用教案》由会员分享,可在线阅读,更多相关《VC++MFC编程实例实用教案(139页珍藏版)》请在装配图网上搜索。

1、10.1 MFC编程流程(lichng) 在普通的C/C+程序中,可以看到程序从main函数开始到结束( jish)的所有代码,但在Visual C+中MFC封装了一部分类,同时也隐藏了一部分代码,因此我们看不到源程序的所有代码,例如从项目的所有源文件中找不到main函数。 基本对话框的MFC程序流程图如图10-1所示。第1页/共138页第一页,共139页。图 10-1程序开始生成CwinApp的一个实例,初始化全局对象WindMain()的函数体初始化句柄AfxWinMain()的函数体退出句柄消息循环退出句柄程序结束第2页/共138页第二页,共139页。 一个MFC程序运行的一般过程如下:

2、 (1) 生成CwinApp的一个实例(shl)(调用CwinApp的构造函数),初始化全局对象; (2) Win32入口程序函数WinMain调用函数AfxWinMain; (3) AfxWinMain调用函数CwinApp的成员函数InitInstance; (4) AfxWinMain调用函数CwinApp的成员函数Run; (5) AfxWinMain函数返回到WinMain,WimMain结束,程序结束。第3页/共138页第三页,共139页。 例10-1 吹泡泡程序。每当用户(yngh)在窗口客户区中按下鼠标左键时即可产生一个泡泡(彩色圆形)。 设计思路:显示一个泡泡所需的数据包括其

3、位置和大小,在MFC中可用其包含矩形表示。可设置一数组,每当用户(yngh)按下鼠标左键时 , 就 产 生 一 个 泡 泡 的 数 据 并 存 入 数 组 中 。 最 后 , 由 框 架 窗 口 类 的OnPaint()函数显示所有的泡泡。第4页/共138页第四页,共139页。 #include #define MAX_BUBBLE 250 class CMyWnd:public CFrameWnd CRect m_rectBubbleMAX_BUBBLE; int m_nBubbleCount; public: CMyWnd() m_nBubbleCount=0;第5页/共138页第五页,共

4、139页。 protected: afx_msg void OnLButtonDown(UINT nFlags,CPoint point); afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() ; /消息(xio xi)映射 BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd) ON_WM_LBUTTONDOWN() ON_WM_PAINT() END_MESSAGE_MAP()第6页/共138页第六页,共139页。 /框架(kun ji)窗口类的成员函数 void CMyWnd:OnLButtonDown(UINT nFlags,CP

5、oint point) if(m_nBubbleCountMAX_BUBBLE) int r=rand()%50+10; CRect rect(point.x-r,point.y-r,point.x+r,point.y+r); m_rectBubblem_nBubbleCount=rect; m_nBubbleCount+; InvalidateRect(rect,FALSE); 第7页/共138页第七页,共139页。 void CMyWnd:OnPaint() CPaintDC dc(this); CBrush brushNew; CPen penNew;brushNew.CreateSol

6、idBrush(RGB(rand()%255,rand()%255,rand()%255); penNew.CreatePen(PS_SOLID,1,RGB(255,0,0); dc.SelectObject(&brushNew); dc.SelectObject(&penNew);第8页/共138页第八页,共139页。 for(int i=0;iCreate(0,_T(吹彩色(cis)泡泡); pFrame-ShowWindow(m_nCmdShow); this-m_pMainWnd=pFrame; return TRUE; CMyApp ThisApp; /全局应用程序对象 按【Ctrl

7、+F5】运行程序,运行结果如图10-2所示。第10页/共138页第十页,共139页。 说明: 该程序声明了两个类,一个是由应用程序类CwinApp派生出来的CmyApp类,一个是由框架窗口CframeWnd类派生出来的CmyWnd类。MFC的基本类名均以字母C打头,习惯上在为使用MFC编写的应用程序中的类起名时也这样做。在程序中还声明了一个CmyWnd类的全局(qunj)对象ThisApp。第11页/共138页第十一页,共139页。图 10-2第12页/共138页第十二页,共139页。 在CmyWnd类中声明了一个数组成员m_rectBubble,用于存放泡泡的数据;另外,还声明了一个整型数据

8、成员m_nBubbleCount, 用来存放数组中泡泡的实际(shj)数量。在框架窗口类的构造函数中该成员变量被初始化为0,由于构造函数非常简单,因此使用了内联函数的形式。 第13页/共138页第十三页,共139页。 OnPaint()函数用于绘制客户区的内容。要完成这项任各,需要先建立一个设备环境(Device Context),这可以通过声明一个CpaintDC类 的 对 象 d c 实 现 。 在 声 明 语 句 中 , 应 将 当 前 窗 口 对 象 指 针 t h i s 传 给C p a i n t D C 类 的 构 造 函 数 , 把 绘 图 区 域 确 定 为 当 前 窗 口

9、 的 客 户 区 。Windows在窗口更新、移动、改变尺寸(ch cun)或移去覆盖在其上的其它窗口对象时均会向该窗口发送WM_PAINT消息,从而触发应用程序调用OnPaint()函数重绘窗口客户区。第14页/共138页第十四页,共139页。 OnPaint()函数根据数组m_rectBubble的内容画出一个泡泡。其中语句。 dc.SelectStockObject(LTGRAY_BRUSH); 用于选择一个库存画刷,画刷决定了所画图形(如椭圆(tuyun)、矩形和多边形等)内部的颜色。 在处理鼠标消息的ONLButtonDown()函数中,语句 int r=rand()%50+10;

10、随机确定了要画出的泡泡的半径(范围为1050像素点),其中全局函数rand()可产生一个随机整数。第15页/共138页第十五页,共139页。 调试: 首先,使用Visual C+集成开发环境(hunjng)中的菜单选项“文件/新建”,并在项目选项卡中选择“Win32 Application。 其次,在编译时要确定应用程序的可执行程序如何使用MFC的类库。一种方法是使用共享的动态链接库(DLL)。这种链接方式显著地减小了应用程序的可执行文件的大小,并能有效地利用系统资源。第16页/共138页第十六页,共139页。 用系统资源。 然而,动态链接到MFC时要求提供Mfcnn.dll库文件,文件名中的

11、nn代表(dibio)MFC的版本号。该文件通常在Windows System或System32文件夹下。如果一个应用程序动态链接到了MFC,但该应用程序通常用在那些可能没有Mfcnn.dll库的计算机系统上,则应把这个库文件作为应用程序包的一部分提供给用户。Microsoft允许程序员自由地把这些库文件附在应用程序中。第17页/共138页第十七页,共139页。 另外,也可以选择应用程序静态链接到MFC。静态链接意味着,应用程序不依赖于MFC库文件的存在(但仍然可能需要Msvcrt.dll文件)。静态链接的代价是可执行文件更大,而且MFC内存(ni cn)的利用可能不够充分。 在菜单中选择“工

12、程”中的“设置”对话框,在对话框右方的“General”选项卡中通过组合框“Microsoft Foundation Classes”选择使用MFC类库的方法。可选项有三种,分别为“Not Using MFC(不使用MFC),Use MFC in a Shared DLL(以动态链接库方式使用MFC)”和“Use MFC in a Static Library(以静态库方式使用MFC)”。第18页/共138页第十八页,共139页。10.2 常用(chn yn)FC类和消息处理 10.2.1 常用MFC类 MFC的类构成了一个完整的体系,该体系由一个被称为Cobject的类作为基类,其它类大部分

13、由该类派生(pishng)而来,如CWnd(窗口类)、Cdocument(文档类)、Cfile(文件类)等。也有一部分类如字符串类,Cstring和时间类Ctime等则不从Cobject继承。 第19页/共138页第十九页,共139页。 1. 窗口公共基类CWnd 类CWnd对所有Windows窗口提供功能支持,它是所有窗口类的直接或间接父类。 一个CWnd对象和一个Windows窗口是有本质区别的,尽管它们有密切的联系(linx)。CWnd对象是一个概念,即类的实例,而Windows窗口则是指向Windows内部数据结构的一个句柄,它的创建和显示要消耗系统资源。一个CWnd对象通过其构造函数

14、被创建,被析构函数销 毁 , 而 一 个 W i n d o w s 窗 口 则 通 过 C W n d 的 C r e a t e 函 数 创 建 , 被DestroyWindow函数销毁。第20页/共138页第二十页,共139页。 1) 窗口句柄 (1) 窗口句柄的创建:当CWnd:Create被调用时,Windows窗口被创建,窗口句柄存放在CWnd的成员变量m_hWnd中。 (2) 程序中窗口句柄的取得:可以直接利用成员变量m_hWnd,但 安 全 的 方 法 是 调 用 函 数 C W n d : : G e t ( ) , 它 返 回 与 窗 口 对 象 相 关 联(gunlin)

15、的句柄,并且当窗口对象没有关联(gunlin)句柄时或当前CWnd指针为NULL时返回空指针。 (3) 窗口句柄的销毁:调用CWnd:DestroyWindow。第21页/共138页第二十一页,共139页。 2) 窗口的大小和位置 (1) IsIconic:窗口是否处在最小化状态。 (2) IsZoomed:判断窗口是否在最大化状态。 (3) MoveWindow:改变窗口的大小、位置和Z轴顺序。Z轴顺序指本窗口和其他(qt)窗口的覆盖关系。 第22页/共138页第二十二页,共139页。 3) 窗口的状态 (1) ShowWindow:显示或隐藏一个窗口,显示可以有多种方式:最大化、最小化、正

16、常显示等。 (2) IsWindowEnabled:判断(pndun)一个窗口是否可见。 (3) IsWindowEnabled:判断(pndun)窗口的禁止/使能状态,禁止状态的窗口不能响应用户的键盘和鼠标的输入。 (4) EnableWindow:设置窗口的禁止/使能状态,参数为true表示使能。第23页/共138页第二十三页,共139页。 4) 定时器函数 (1) SetTimer:开始一个系统(xtng)定时器。定时器的作用是每隔指定时间发一次WM_TIMER消息。 (2) KillTimer:结束一个指定的系统(xtng)定时器。 5) 提示函数 (1) FlashWindow:闪烁

17、窗口。 (2) MessageBox:弹出一个标准消息框。第24页/共138页第二十四页,共139页。 例如:开始一个系统定时器每0.5秒发一次WM_TIMER消息,代码为: SetTimer(1,500,NULL): 其 中 , 第 一 个 参 数 表 示 定 时 器 的 标 识 , 第 二 个 参 数 表 示 发 送WM_TIMER的间隔时间,第三个参数是一个回调函数,一般设为NULL。可以在WM_TIMER消息的处理函数OnTimer(通过ClassWizard添加)中加入处理代码来响应(xingyng)定时器消息。结束定时器的方法是调用以定时器标识为参数的函数KillTimer,比如:

18、KillTimer(1); 第25页/共138页第二十五页,共139页。 2字符串类CString Cstring类是MFC对字符串的封装,它包含一个可变长的字符序列,提供了很多串操作,使用它比使用其它字符串类型更加方便。可以说,几乎每个MFC程序都要用到这个类。CString没有继承任何类,且其各个字符都是TCHAR类型。 CString对象可以随着串合并操作动态增加其长度,而无须用户来对其长度进行专门设置。CString可以看作(kn zu)一个串类型,而不是一个指向字符串的指针。第26页/共138页第二十六页,共139页。 1) CString的构造函数 CString类拥有众多的构造函

19、数,用于以不同(b tn)的数据类型和不同(b tn)的方式构造一个字符串对象,它们是 (1) CString(); /无参数的构造函数,产生一个空的Cstring对象 (2) CString(const Cstring&stringSrc); /用另外一个Cstring对象的值初始化对象 (3) CString(TCHAR ch,int nRepeat=1); /用一个字符重复若干次来初始化对象第27页/共138页第二十七页,共139页。 (4) CString(LPCTSTR lpch,int nLength); /用一个字符数组和一定长度(chngd)初始化对象 (5) CString(

20、const unsigned char *psz); /从一个无符号字符指针构造对象 例如: CString s1; CString s2(big); CString s3=s2; CString s4(s2+ +s3);第28页/共138页第二十八页,共139页。 2) CString的基本操作 Cstring的基本操作如下: (1) 求得到字符(z f)串长度:GetLength返回一个int类型的数。 (2) 判断字符(z f)串是否为空:BOOL IsEmpth() const。 (3) 强制字符(z f)串长度为0:void Empty()。 (4) 得到字符(z f)串某位置的字符

21、(z f):TCHAR GetAt(int nIndex) const。 ( 5 ) 设 置 字 符 ( z f ) 串 某 位 置 的 字 符 ( z f ) : v o i d S e t A t ( i n t nIndex,TCHAR ch)。 (6) 强制转换为字符(z f)串指针类型:operator LPCTSTR。 第29页/共138页第二十九页,共139页。 例如(lr),获取字符串str最后一个字符的语句如下: CString str=aabbcde; Char c1=str.GetAt(str.GetLength()-1);第30页/共138页第三十页,共139页。 3)

22、 串提取 串提取函数由于根据某种原则从串中提取一个(y )子串。相关函数包括Mid,Left和Right。 (1) CString Mid(int nFirst) const; /获取从nFirst位置字符开始的子串 (2) CString Mid(int nFrist,int nCount) const; /获取从nFirst位置的字符开始包含nCount /个字符的子串(即到nFirst+nCount-1位置 /的字符为止)第31页/共138页第三十一页,共139页。 (3) CString Lef t(int nCount)const; /获取左边(zu bian)nCount个字符所构

23、成的子串 (4) CString Right(int nCount)const; /获取右边nCount个字符所构成的子串 4) 转换字符串 (1) void MakeUpper();/将字符串中所有字符换成大写 (2) void MakeLower();/将字符串中所有字符换成小写 (3) void MakeReverse();/将字符串中各字符的顺序倒转 (4) void Empty(); /将字符串中所有字符删除第32页/共138页第三十二页,共139页。 5) 字符串格式化函数 字符串格式化函数是CString:Format,它根据一个参数(cnsh)字符串(格式控制字符串)和几个变量

24、来格式化一个串。 该函数的格式如下: void Format(LPCTSTR lpszFormat,.); void Format(UINT nFormatID,.);第33页/共138页第三十三页,共139页。 该成员函数用于根据格式lpszFormat,用其它数据构造一个字符串。其中省略号“.是输出参数表,每个参数可以是一个变量或表达式。函数Format常常用于把其它类型的变量转换为字符串形式,或者把几个( j )不同类型的值合并成一个字符串的形式。第34页/共138页第三十四页,共139页。 例如(lr): CString s1,s2,s3; s1.Format(%c,65); s2.F

25、ormat(float:%f,int:%d,hexint:%x,3.48,20,0 xFF); s3.Format(string:%s,formated float:%2.1f,hehe,3.14159); 执 行 以 上 代 码 后 s 1 字 符 串 是 A , s 2 字 符 串 是 f l o a t : 3 . 4 8 0 0 0 0 , i n t : 2 0 , h e x i n t : f f , s 3 字 符 串 是string:hehe,formated float:3.1。第35页/共138页第三十五页,共139页。 3CPoint、Crect和Csize类 1) C

26、point类 MFC中的Cpoint类是对Windows结构POINT的封装,凡是能用POINT结构的地方都可以用Cpoint代替。Cpoint提供了一些成员函数,使得操作POINT结构和Cpoint类更加方便。 结构POINT表示一个(y )屏幕上的二维点,它的定义如下:第36页/共138页第三十六页,共139页。 typedef struct tagPOINT LONG x; LONG y; POINT; 其中(qzhng)x和y分别是点的横坐标和纵坐标。第37页/共138页第三十七页,共139页。 2) CSize类 MFC中的Csize类是对indows结构SIZE的封装,凡是能用SI

27、ZE结构的地方都可以用CSize代替。结构SIZE表示一个矩形的长度和宽度(kund),它的定义如下: typedef struct tagSIZE int cx; int cy; SIZE; 其中cx和cy分别是矩形的长度和宽度(kund)。第38页/共138页第三十八页,共139页。 3) CRect类 Crect类是对Windows结构RECT的封装。结构RECT表示一个矩形( jxng)。 Typedef struct tagRECT LONG left; LONG top; LONG right; LONG bottom; RECT; 其中,left和top分别表示矩形( jxng)

28、左上角顶点的横、纵坐标;right和bottom分别表示矩形( jxng)右下角顶点的横、纵坐标。 第39页/共138页第三十九页,共139页。 4CPaintDC类 在CpaintDC类中封装了大量的绘图和文字输出方法(成员函数) (1) 文字信息显示。文字信息显示的成员函数为: BOOL TextOut(int x,int y,LPCTSTR lpszString); 该函数用于在指定坐标(x,y)处显示字符串lpszString的内容,显示成功(chnggng)返回非0值,否则返回0。坐标原点(0,0)在客户区左上角,Y轴向下。第40页/共138页第四十页,共139页。 (2) 画点。画

29、点的成员函数为 COLORREF SetPixel(int x,int y,COLORREF color); COLORREF SetPIxel(POINT point,COLORREF color); 该函数在指定(zhdng)坐标处按给定颜色画点,返回值为原来此坐标处的颜色。 (3) 取指定(zhdng)坐标点的颜色。取指定(zhdng)坐标点的颜色的函数为: COLORREF GetPixel(int x,int y)const; COLORREF GetPixel(POINT point)const; 该函数的返回值为指定(zhdng)坐标处的颜色。第41页/共138页第四十一页,共1

30、39页。 ( 4 ) 画 线 。 画 线 分 两 步 完 成 : 首 先 确 定 线 的 起 始 位 置 , 然 后 再 调 用(dioyng)画线函数。 用MovoTo将绘图位置移动到指定位置的原型为: CPoint MoveTo(int x,int y); Cpoint Moveto(POINT point); 用LineTo函数画线的原型为: BOOL LineTo(int x,int y); BOOL LineTo(POINT point);第42页/共138页第四十二页,共139页。 (5) 绘制矩形( jxng)。绘制矩形( jxng)的成员函数为: BOOL Rectangle(

31、int x1,int y1,int x2,int y2); BOOL Rectangle(LPCRECT lpRect); 该函数的参数为需要绘制的矩形( jxng)的左上角坐标(x1,y1)和右下角坐标(x2,y2)。 (6) 绘制椭圆。绘制椭圆的成员函数的原型为: BOOL Ellipse(int x1,int y1,int x2,int y2); BOOL Ellipse(LPCRECT lpRect); 该函数的参数的含义为所绘椭圆的包含矩形( jxng)的左上角和右下角坐标。 第43页/共138页第四十三页,共139页。 10.2.2 绘制图形 1. 图形对象(duxing)的使用方

32、法 普通绘图对象(duxing)使用的模式为以下4步: (1) 生成绘图对象(duxing)。 例如: Cpen pen,*op; pen.CreatePen(PS_SOLID,1,RGB(0,0,0);第44页/共138页第四十四页,共139页。 这里(zhl)定义的Cpen类指针op用于存储绘图前的画笔,使绘图结束后能够恢复系统原有状态。上面代码中的RGB(0,0,0)是一个宏,用于定义COLORREF类型的颜色。COLORREF实际上是一个32位整数类型,用于表示颜色,其第0、1、2字节分别用于存放该颜色的红、绿、蓝色分量。如果已知某颜色的3个分量,则可使用宏RGB()构造出该颜色: C

33、OLORREF RGB(BYTE bRed,BYTE bGreen,BYTE bBlue);第45页/共138页第四十五页,共139页。 其中,第1个参数是颜色的红色(hngs)分量,第2个参数是颜色的绿色分量,第3个参数是颜色的蓝色分量,各个分量的取值范围为0255。例如:RGB(0,0,0)为黑色,RGB(255,255,255)为白色。第46页/共138页第四十六页,共139页。 (2) 将绘图对象选入绘图设备环境。其代码为: op=pDC-SelectObject(&pen); 可以(ky)看出,将绘图对象选入绘图设备环境的方法是调用CDC:SelectObject()函数,与此同时,

34、还要保留旧的画笔。 (3) 进行绘图。其代码为: pDC-Moveto(100,100); pDC-Lineto(200,200);第47页/共138页第四十七页,共139页。 (4) 绘图工作结束后,进行绘图设备环境的恢复工作。其代码为: pDC-SelectObject(op); 如果(rgu)还要改变pen的参数的话,必须将pen删除: pen.DeletObject();第48页/共138页第四十八页,共139页。 2. 画笔和画刷 画笔是用来画线的工具,是Cpen类的对象。画刷是用来填充图形(txng)的工具,是Cbrush类的对象。 1) 画笔 画笔由Cpen类管理,使用Cpen类

35、对象时,需要无对其进行初始化工作,初始化Cpen类对象的方法有以下3种: (1) 调用Cpen类的构造函数。第49页/共138页第四十九页,共139页。 (2) 调用Cpen:CreatePen(int nPenStyle, int nWidth,COLORREF crColor)函数。其中第1个参数是画笔的样式,可取值为: PS_SOLID /创建(chungjin)实线笔 PS_DASH /创建(chungjin)由短线构成的虚线 PS_DOT /创建(chungjin)由点构成的虚线 PS_DASHDOT /创建(chungjin)由短线和点构成的虚线第50页/共138页第五十页,共13

36、9页。 (3) 调用Cpen:CreatePenIndirect()函数,通过LPLOGPEN结构来设置Cpen的属性。例如: Cpen penRed; /说明画笔对象 penRed.CreatePen(PS_SOLID,3,RGB(255,0,0); /创建宽度为3的红色实线画笔 /使用新的画笔时,要保存原来(yunli)的画笔以便恢复 Cpen *pOldPen; POldPen=dc.SelectObject(&penRed); /以下是作图代码,且使用新画笔画线 dc.SelectObject(pOldPen); /恢复原来(yunli)的画笔第51页/共138页第五十一页,共139页

37、。 2) 画刷 画刷是用来填充图形的工具,创建画刷有两种方法:一种是调用构造函数,另一种是调用相关的成员函数。 使用画刷叶要定义画刷对象,创建画刷并保存原来的画刷,在绘图工作结束( jish)后还要恢复原来的画刷。例如: C b r u s h N e w B r u s h ;/声明画刷对象 C b r u s h * P O l d B r u s h ;/保存原画刷的指针 NewBrush.CreateSolidBrush(PS_SOLID,21,RGB(0,0,255);/建立画刷第52页/共138页第五十二页,共139页。 Pold_Brush=pDC-SelectObject(&N

38、ewBrush);/将画刷选入设备文本对象 /使用画刷 /恢复(huf)原先的画刷对象 pDC-Selectobject(PoldBrush);第53页/共138页第五十三页,共139页。 10.2.3 消息处理 Windows操作系统是一个基于( jy)消息的操作系统,其程序总要同消息打交道,这正是Windows程序同DOS程序不同的地方。实际上,Windows系统通过Windows消息告诉所有应用程序发生了什么事件,例如用户点击了鼠标、用户点击了键盘的哪个键等,每个应用程序都有消息处理或一组消息响应函数,用于对消息进行响应。第54页/共138页第五十四页,共139页。 Windows操作系

39、统中定义了900余个Windows消息,系统将用户的输入传给应用程序,然后又为每个输入产生消息。此外,系统还为应用程序的变化产生消息,如窗口的尺寸发生(fshng)了变化等。应用程序自已也可能产生消息,用于对应用程序内部发生(fshng)的特殊事件进行处理或其它应用程序之间的通信。第55页/共138页第五十五页,共139页。 系统向应用程序发送消息(xio xi)时,将向应用程序发送个参数: ( 1 ) 一 个 窗 口 的 句 柄 : 窗 口 句 柄 用 于 标 识 窗 口 的 一 个 常 数 ,Windows的每个窗口都有一个窗口句柄。消息(xio xi)参数中的窗口句柄标识的是接受消息(x

40、io xi)的窗口。 (2) 一个消息(xio xi)标识:标识了产生的消息(xio xi)。消息( x i o x i ) 标 识 的 例 子 有 W M _ C R E AT E , 其 中 , W M _ 代 表 i n d o w s Message,是indows窗口产生的消息(xio xi),而WM_CREATE代表窗口正在被创建,WM_PAINT则代表窗口的客户区需要被重画。第56页/共138页第五十六页,共139页。 (3) 两个32位的参数:消息参数定义了Windows应用程序处理消息所需的数据或数据所在的位置,这两个参数的含义与具体的消息有关。消息参数可以包含一个(y )整

41、数、一组标志或一个(y )结构对象的指针。消息参数也可以是NULL,表示消息没有参数。 1. Windows消息分类 Windows消息大体上可以分为两大类:一类是系统定义的消息,另一类是用户自定义的消息。其中Windows系统定义的消息可以分为以下种:第57页/共138页第五十七页,共139页。 (1) Windows消息:这类消息主要是以WM_作前缀的消息(WM_COMMAND除外,WM_COMMAND消息专门被用于处理菜单和控件发出的消息),且必须由CWnd类或CWnd类的派生类进行处理。消息响应函数也必须被定义(dngy)在发送消息CWnd类或 CWnd派生类中。可见,这类消息属于面向

42、Windows窗口的消息。第58页/共138页第五十八页,共139页。 (2) 控件通知消息:这类消息主要由控件或其它子窗口发出,并对各控件或子窗口的父窗口进行处理。这类消息属于WM_COMMAND消息,只不过在WM_COMMAND消息的两个消息参数中包含了每个控件的句柄、标识(biozh)(ID)和通知消息等信息。 (3) Windows命令消息:这类消息是指由菜单、工具条和加速键等发出的WM_COMMAND通知消息。第59页/共138页第五十九页,共139页。 2. 鼠标消息处理 移动鼠标或点击鼠标按键,Windows便产生(chnshng)一个或多个消息并将其发送给位于鼠标光标下的窗口。

43、编程时常用的鼠标消息有: WM_LBUTTONDOWN /按下鼠标左键 WM_LBUTTONUP /释放鼠标左键 WM_LBUTTONDBLCLK /双击鼠标左键 WM_RBUTTONDOWM /按下鼠标右键 WM_RBUTTONUP /释放鼠标右键 WM_RBUTTONDBLCLK /双击鼠标右键 WM_MOUSEMOVE /移动鼠标 第60页/共138页第六十页,共139页。 对应的Wnd类的消息(xio xi)处理成员函数分别为: void OnLButtonDown(UINT nFlags,CPoint point); void OnLButtonUp(UINT nFlags,CPon

44、t point); void OnLButtonDblClk(UINT nFlags,Cpoint point); void OnRButtonDown(UINT nFlags,Cpoint point); void OnRButtonUp(UINT nFlags,Cpoint point); void OnRButtonDblClk(UINT nFlags,Cpoint point); void OnMouseMove(UINT nFlags,Cpoint point);第61页/共138页第六十一页,共139页。 其中,参数point表示鼠标的位置,nFlags是几个控制键的状态,可以(k

45、y)是下列值及其组合: MK_CONTROL /Ctrl键被按下 MK_LBUTTON /鼠标左键被按下 MK_RBUTTON /鼠标右键被按下 MK_SHIFT /Shift键被按下 例如:“MK_SHIFT|MK_LBUTTON”表示同时按下了Shift键和鼠标左键。第62页/共138页第六十二页,共139页。10.3 对话框的应用(yngyng) 对话框是一些弹出式窗口信息的弹出式窗口。它通常包含,应用程序利用它可和用户进行交互式操作。对话框是应用程序,用于显示或提示并等待用户输入一个或多个控件,利用这些控件,用户可以输入文本、选择选项,并完成某一特定(tdng)命令。第63页/共138

46、页第六十三页,共139页。 对话框分为模式对话框和非模式对话框两种。模式对话框是指这种对话框出现时,它的父窗口将暂时失效,只有处理完对话框所要求的动作后,才会将控制权交回给父窗口。非模态对话框图类似普通的窗口,并不垄断用户的输入。在非模式对话框打开时,用户随时可用鼠标点击等手段激活其它窗口对象,操作完毕后再回到本对话框。本节只通过(tnggu)一个实例来介绍模式对话框。 图10-3是用AppWizard生成的一个基于对话框的程序运行界面。下面详细介绍它的实现步骤:第64页/共138页第六十四页,共139页。图 10-3 第65页/共138页第六十五页,共139页。 1. 产生对话框模板 在VC

47、+ 6.0中选择菜单“File”“New”或按【Ctrl+N】键,弹出一个对话框,如图10-4所示。在对话框中选择工程标签页,用鼠标选中左边列表框中的“MFC AppWizard 【exe】”一行;在“C位置:”处输入存放源代码的目录(ml)的名字,单击“确定”后出现图10-5所示对话框。第66页/共138页第六十六页,共139页。图 10-4第67页/共138页第六十七页,共139页。图 10-5 第68页/共138页第六十八页,共139页。 2. 设置(shzh)对话框模板 设置(shzh)对话框模板一般需要以下几步:设置(shzh)对话框的属性;向对话框模板放置控件;通过控件属性对话框设

48、置(shzh)各个控件的属性和控件的跳表顺序。 1) 设置(shzh)对话框的属性 首先调整模板的大小:把鼠标放在对话框模板的边或角上,等鼠标变为双箭头形状,拖动鼠标即可。 点击对话框模板(而不是它上面某一控件),按【Enter】键弹出属性设置(shzh)对话框,图10-6所示为该对话框的General页。可以设置(shzh)对话框的风格和各边界滚动条的类型,对话框的标题等。第69页/共138页第六十九页,共139页。图 10-6第70页/共138页第七十页,共139页。 2) 添加控件并设置控件属性 添加控件要借助于控件工具条(图10-7所示),控件工具条提供了25种控件。常用的控件是:图形

49、控件(Picture)、静态文本框(Static Text)、编辑框(Edit Box)、组框(Gorup Box)、按钮(Botton)、复选框(Check Box)和单选框(Radio Button)。图形控件用于显示位图(Bitmap)和图标(Icon);静态文本框用于显示静态文本(当然显示的内容可以通过程序改变);编辑框用于数据的输入和显示;组框用于把若干控件从视觉上组合成一组,形成友好的界面;按钮用于用户向程序提供命令;复选框完成开关功能;单选框也提供选择,它与复选框的区别是在一组单选框中,用户只能选择其中一个(y ),并且单选框自已不能取消自已的选择,而只能通过选中别的单选框来取消

50、。第71页/共138页第七十一页,共139页。图 10-7 选择指针静态文本框复选框组框图形控件编辑框按钮单选框第72页/共138页第七十二页,共139页。 向对话框增加一个控件的方法是在控件工具条上通过单击选择一个控件,然后在对话框模板上按下鼠标左键,控件就会按默认(mrn)大小放置在对话框上。通过单击选中控件,把鼠标光标移动到控件边缘,等光标呈箭头状时拖动鼠标可以改变控件的大小。删除一个控件的方法是先选中控件后按【Delete】键。 设置控件的属性:先选中控件,按【Enter】键(或者按鼠标右键,在弹出的菜单上选择Properties项)弹出图10-8所示的属性对话窗口,在该窗口中可以设置

51、控件的标识符(ID),标题(Caption)和各种风格(Style)等。第73页/共138页第七十三页,共139页。图 10-8 第74页/共138页第七十四页,共139页。 在图10-9中,将对话框模板上的“TODO:在这是设置对话控制”静态文本框和“确定”按钮删除。为对话框增加(zngji)3个编辑框,它们的ID分别为ID_EDIT_ADD1,ID_EDIT_ADD2和ID_EDIT_ADD3;添加两个静态文本框,它们的Caption分别为“+”和“=”。另外,“+”和“=”的属性页对话框的Styles属性页要作两点改变:将“X对齐文本”属性设为Center,选择“C中垂直”复选框,如图1

52、0-10所示。第75页/共138页第七十五页,共139页。 图 10-9 第76页/共138页第七十六页,共139页。图 10-10第77页/共138页第七十七页,共139页。 再添加两个命令按钮,它们的Caption分别为“计算结果”和“退出”,“计算结果”的ID是IDC_BUTTON1,“退出”的ID是IDC_BUTTON2。 3) 定义成员变量 增加了3个编辑框后,获取三个编辑框中的输入数字的常用方法是:先定义一些与控件相联系(linx)的变量,然后在程序中通过这些变量来完成对控件的控制。 为控件定义变量最方便的方法是通过ClassWizard。按【Ctrl+W】键,弹出图10-11所示

53、的MFC ClassWizard对话框,选择Member Variables窗口如图10-12所示。第78页/共138页第七十八页,共139页。图 10-11 第79页/共138页第七十九页,共139页。图 10-12 第80页/共138页第八十页,共139页。 选中“IDC_EDIT1”,双击鼠标或单击Add Variable.按钮,弹出图10-13所示的对话框,这个对话框用来增加与控件相联系的成员变量。先为变量取名为m_add1,填在Member variable name中。这个变量用来存放用户在IDC_EDIT1编辑框中输入的数,供程序计算结果用;再选择变量的类别填在Category中

54、,可以为Value或Control,后者表示所定义 的 变 量 是 控 件 类 的 一 个 对 象 ( d u x i n g ) , 比 如 对 于 编 辑 框 而 言 ,Control类变量的类型是Cedit,前者表示所定义的变量是与控件相联系的一个值, 第81页/共138页第八十一页,共139页。 这个值的含义随不同类型的控件而不同,如对于编辑框而言,变量表示在编辑框所输入的内容。有的控件不能定义与之相关(xinggun)的Value变量,如按扭;最后选择变量的类型填在Variable type中,变量m_add1的类型定义为double类型。 用同样的方法可以为其它控件增加变量,最终增

55、加的所有变量如下: IDC_EDIT1,double,a_add1 IDC_EDIT2,double,a_add2 IDC_EDIT3,double,a_add3第82页/共138页第八十二页,共139页。图 10-13 第83页/共138页第八十三页,共139页。 4) 增加事件处理函数 在程序中希望点击图10-3中的命令按钮“计算结果”时,会将输入的两个数的和填入第3个编辑框。要想实现以上操作,必须为“计算结果”这个命令按钮填加鼠标左键单击命令按扭的处理函数。这样当鼠标左键单击这个事件发生时,就会执行这个处理函数。 增加事件处理函数有两种方法(fngf): (1) 通过专门的事件处理对话框

56、第84页/共138页第八十四页,共139页。 (2) 可以在10-11窗口(chungku)中所示的ClassWizard的Message Maps标签页为控件添加事件处理函数。 下面介绍第1种方法:选中图10-3中“计算结果”按钮,单击鼠标右键,在弹出菜单中选择Events,弹出的对话框如图10-14所示。第85页/共138页第八十五页,共139页。图 10-14 第86页/共138页第八十六页,共139页。 此窗口用于添加、删除窗口的消息和事件处理函数。本程序需为按 钮 增 加 ( z n g j i ) 单 击 事 件 处 理 函 数 : 双 击 左 边 列 表 框 中 的“BN_CLI

57、CKED”(这时会弹出一个对话框让用户修改事件处理函数的名字,若保持默认的名字,直接单击“确定”即可)。添加完单击事件处理函数后的对话框如图10-15所示,注意到增加(zngji)了处理函数的事件名移动到了右边的列表框中,在图10-15中单击Edit Existing按钮可以直接进入对话框的源文件(.CPP),并为事件响应函数增加(zngji)代码。第87页/共138页第八十七页,共139页。图 10-15第88页/共138页第八十八页,共139页。 因为添加的函数全都是空的,所以需要手工添加代码来实现用户想要的功能。在下面的程序中有一个函数UpdateData()出现了两次,其格式为: BO

58、OL UpdateData(BOOL bSaveAndValidate=TRUE); UpdateData函数是MFC中的CWnd类的成员(chngyun)函数,CWnd类是很重要的MFC类,所有窗口类都直接或间接地继承于它。本程序主对话窗口类ClitleAdderDlg继承了Cdialog,而Cdialog又继承了CWnd,因此可以在程序中使用函数UpdateData。第89页/共138页第八十九页,共139页。 用户在程序运行过程中通过鼠标或键盘修改了对话框控件的状态后,对话框中与控件相关联的变量值并没有(mi yu)马上更新。以参数TRUE调用函数UpdateData()的作用就是更新所

59、有与对话框图控件相关联的变量值,而以参数FALSE调用此函数则更新与变量相关联的控件的显示状态,使之与变量一致。也可以通俗地说,以TRUE和FALSE作为参数可分别实现控件关联变量的“里传”和“外传”。下面的语句起刷新编辑框的作用。第90页/共138页第九十页,共139页。 void CSf1Dlg:BUTTON1() / TODO: Add extra validation here(在这里(zhl)增加用户代码)UpdateData(true);m_add3=m_add1+m_add2;UpdateData(false); 第91页/共138页第九十一页,共139页。 各关联变量的初值在函

60、数CSf1Dlg:CSf1Dlg(它是程序主对话框类的构造函数)中初始化,它是由程序自动(zdng)生成的。如果想修改某些变量的初值,可以在源程序中找到该函数,修改某些变量的初始值。即 CSf1Dlg:CSf1Dlg(CWnd* pParent /*=NULL*/) : CDialog(CSf1Dlg:IDD, pParent) 第92页/共138页第九十二页,共139页。/AFX_DATA_INIT(CSf1Dlg)m_add1 = 0.0f;m_add2 = 0.0f;m_add3 = 0.0f;/AFX_DATA_INIT/ Note that LoadIcon does not req

61、uire a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME); 第93页/共138页第九十三页,共139页。 到此本程序编制完成,可以按【Ctrl+F5】键看它的运行结果。本程序并不是很完善,但作者仅仅是想通过这个(zh ge)例子告诉读者简单的对话窗口是如何编制的。如果读者感兴趣,你可以试着增加一些控件或功能使它更加完善。第94页/共138页第九十四页,共139页。10.4 菜 单 的 应 用 菜单是一个专业程序不可缺少的程序界面构件,对于(duy)不同的程序,这些构件会以不同的面貌出现

62、。菜单是Windows使用者天天都要见到的应用元素。第95页/共138页第九十五页,共139页。 菜单由上层(shngcng)水平列表项及与其相连的弹出式菜单项组成,用户选择了上层(shngcng)某个列表项时,与之相连的弹出式菜单就会随即出现。菜单的各个菜单项用来响应用户的鼠标单击而产生命令消息,从而提供一种用户对程序进行控制的方式。由于弹出式菜单平时是隐藏的,只露出上层(shngcng)水平列表项,因此菜单能容纳大量的操作。第96页/共138页第九十六页,共139页。 菜单也是一种(y zhn)资源,因此要通过Developer Studio的资源编辑器编辑。“弹出式菜单”、“选项”和“分

63、隔线”是构成“树状菜单”的三大要素。通过“弹出式菜单”可以调出一个子菜单,分隔线用来区分一组选项。通过菜单中的“选项”可以调用应用程序的某项功能。每个选项均有一个标识符,而且只有选项才有标识符。 在应用程序中只对选项编程。当用户选择了一个菜单选项后,就会向应用程序发送一个命令消息WM_COMMAND。该消息的格式为 ON_COMMAND(id,memberFxn)第97页/共138页第九十七页,共139页。 1. 编辑菜单 选择“插入”“资源(zyun)”菜单项或按【Ctrl+R】键,在弹出的添加资源(zyun)对话框中选择“菜单”,然后按【Enter】键,即可向项目添加一个菜单资源(zyun

64、)。这时,菜单资源(zyun)编辑器打开,菜单编辑器的窗口如图10-16所示。其中,灰色的横条是菜单,周围有一个白框的灰色块是要添加的菜单项。下面分几步编辑菜单: 第98页/共138页第九十八页,共139页。图 10-16 要添加的菜单项菜单第99页/共138页第九十九页,共139页。图 10-17第100页/共138页第一百页,共139页。 1) 添加菜单上层水平列表项 单击选中要添加的菜单项小灰块,按【Enter】键弹出其属性对话框(如图10-7所示),上层水平列表项是具有弹出属性的菜单项,它没有ID,它的“C标题”是菜单上显示的字符串,也叫菜单的名字。在图中的“C标题”处输入了字符串“文

65、件(&F),当程序运行时界面上将显示“文件(F)(字符&并不显示出来),实际上,字符&的作用(zuyng)是使紧跟在它后面的字符下面加下划线。这样按【Alt+V】键可激活此菜单项,这是利用键盘选择菜单项的一种方法。第101页/共138页第一百零一页,共139页。 2) 添加各上层水平列表项的子菜单项 单击已经添加的某一个水平列表菜单项,其下面(xi mian)会出现一个空的菜单项,选中这个空的菜单项,按【Enter】键弹出要新加子菜单的属性对话框,在对话框中输入菜单项的ID和Caption,然后设置菜单的其它属性。有时希望把功能相近的菜单项放在一起成为一组,通过一个横的分割线把它与其它菜单项分

66、割开。产生一条分割线的方法是在菜单项的属性对话框中选择“分隔符”复选框。第102页/共138页第一百零二页,共139页。图 10-18 第103页/共138页第一百零三页,共139页。 2. 为菜单单击增加(zngji)消息响应函数 1) 方法一 设置好菜单的各个菜单项后,就可用ClassWizard为菜单增加(zngji)消息响应函数了。(通过按【Ctrl+W】键)弹出ClassWizard对话框后,选择ClassWizard的Message Maps页(如图10-19所示)第104页/共138页第一百零四页,共139页。图 10-19第105页/共138页第一百零五页,共139页。 在图10-19中的Project和Class name组合框中分别选择要为哪个项目的哪个类增加消息响应函数,所以Project 中选择“Menutest和Class name组合框中选择“CmenuTestView。在Object Ids列表框中选中一个(y )菜单ID(比如ID_TEST_COMMAND),可以为这个ID的菜单增加单击响应函数,方法是:选中右边Message列表框中的COMMAND行,

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!