本节演示在MFC中,开发弹出对话框的过程和弹出对话框消息处理的过程。MFC的消息处理不是使用一个全局的回调函数,而是创建一个与窗口关联的派生类,用于消息关联的成员函数来接收和处理窗口的消息。在类向导中选择对应的消息,添加与该消息关联的成员函数来处理该消息,这就是MFC的消息映射机制。MFC的消息映射机制,一般不需要开发者解析这些复杂的数据,因为消息映射函......
2023-11-25
窗口消息按照消息的来源可以分为系统定义的消息和应用程序自定义的消息。系统消息编号的范围是0~WM_USER-1,应用程序自定义消息是WM_USER~0x7FFF,WM_USER的数值是1024(0x400)。常用的一些消息,如WM_CLOSE(0x0010)、WM_MOUSEMOVE(0x0200)等都属于系统消息。
1)SendMessage和PostMessage函数都是消息传递函数,通过MSDN查看两个函数的格式。
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
2)SendMessage和PostMessage这两个函数消息的区别如下。
①返回值类型不同。2个函数的4个参数的意义是一样的,只有返回值类型不同(其实从数据上看它们同样都是一个32位的数,只是意义不一样),LRESULT表示消息被处理后的返回值,BOOL表示消息是否传递成功。
②PostMessage是异步的,SendMessage是同步的。PostMessage只把消息放入窗口消息队列中,不管消息被处理后的结果就返回;而SendMessage等待消息被处理完了之后才返回。
③如果在同一个线程内,则经常使用SendMessage发送消息时,速度快并能得到返回的消息处理结果。在不同线程或者进程之间,一般使用PostMessage发送消息,把消息先放入目标窗口的消息队列中,然后由目标窗口通过消息循环自行派发处理。
3)新建一个Win32工程,编写一段简单的代码测试消息传递函数。
在不同进程之间,经常使用PostMessge发送命令或者传递数据。
4)MFC封装后的传递函数。
LRESULT SendMessage(UINT message,WPARAM wParam=0,LPARAM lParam=0);
BOOL PostMessage(UINT message,WPARAM wParam=0,LPARAM lParam=0);
在MFC工程中调用。
CWnd*p=FindWindow("NotePad",NULL);//查找一个记事本的窗口
if(p) //如果发现发送一个关闭窗口的消息
p->PostMessage(WM_CLOSE);
MFC在CWnd类中封装了以上两个函数,带有两个默认参数使用起来更加方便。在MFC工程中也可以使用上面的Win32函数,通过窗口句柄传递消息。在MFC中调用Win32函数时,函数名前经常要使用空定义域符号“::”,这是C++用于区别全局函数和成员函数的标志。
HWND hWnd=::FindWindow("NotePad",NULL); //查找一个记事本的窗口(www.chuimin.cn)
if(hWnd) //如果发现
::PostMessage(hWnd,WM_CLOSE,0,0); //发送一个关闭窗口的消息
5)接收自定义消息。
在Win32程序中只要在回调函数中使用分支语句,即可接收并处理自定义消息。在MFC程序中,必须使用ON_MESSAGE来关联消息映射函数。打开MSDN查看关于ON_MESSAGE的说明,很明显它是用于处理用户自定义消息的。接收自定义消息的函数,即ON_MESSAGE的消息映射函数,必须完全符合以下定义。
afx_msg LRESULT memberFxn(WPARAM,LPARAM);
6)新建立一个基于对话框的MFC工程“TestMsg”,来测试自定义消息的发送和接收。
参照与MSDN中ON_MESSAGE的例程,在BEGIN_MESSAGE_MAP下面编写代码。
7)在头文件TestMsgDlg.h中“//{{AFX_MSG”下面,添加两个函数的声明。
8)在窗口类源文件TestMsgDlg.cpp的最后,添加两个函数的函数体代码。
9)在对话框初始化函数中编写代码,并设置断点,如图3-59所示。
在断点处按<F10>键单步执行,SendMessage和PostMessage测试的结果如下。
SendMessage是阻塞的,要等OnSendMessage函数执行完后才继续,同时SendMessage的返回值是OnSendMessage返回的2个数字相加的结果。
PostMessage是非阻塞的,不等OnPostMessage执行完就继续向下执行,而且返回值是1,代表消息已经传送到。
图3-59 测试SendMessage和PostMessage函数
有关VC++就业培训宝典之MFC视频教程的文章
本节演示在MFC中,开发弹出对话框的过程和弹出对话框消息处理的过程。MFC的消息处理不是使用一个全局的回调函数,而是创建一个与窗口关联的派生类,用于消息关联的成员函数来接收和处理窗口的消息。在类向导中选择对应的消息,添加与该消息关联的成员函数来处理该消息,这就是MFC的消息映射机制。MFC的消息映射机制,一般不需要开发者解析这些复杂的数据,因为消息映射函......
2023-11-25
②“//{{AFX_MSG”下面的代码,是用来管理以“WM_”开头的Windows消息映射函数的。消息映射函数,就是MFC自动把每个消息分离出来,并关联到一个类成员函数上。它是另一类回调函数,和消息回调映射函数类似。基于以上宏定义,把消息映射关联代码替换成原型后会发现ON_WM_MOUSEMOVE是WM_MOUSEMOVE消息和OnMouseMove成员函数地址的关联。4)解密消息映射宏定义。messageMap结构体主要是建立和处理基类消息和派生类消息之间的关系。......
2023-11-25
分页技术,是指在父窗口中定义多个子窗口页面,每个页面包含了一组用于信息管理的控件。创建一个工程名为“usd”的对话框程序,用于演示分页管理技术。图9-12 添加数据型关联变量9)修改IDD_PAGE3对话框的字体和外观,大小与前两个分页相同,如图9-13所示。表9-6 第三分页对话框的控件属性11)创建与IDD_PAGE3关联的CDialog派生类CPage3,并建立数据型关联变量,如图9-14所示。24)建立“添加”按钮的消息映射函数并修改代码。......
2023-11-25
创建一个工程名为“dyn”的SDI程序,用于了解动态创建的原理和使用方法,如图13-18所示。4)根据宏定义原型,翻译CMainFrame类声明动态创建宏的结果如下。6)再打开CMainFrame的源文件查看,在开头部分可以看到执行动态创建的宏,如图13-21所示。#define RUNTIME_CLASS11)再次翻译CMainFrame类执行动态创建宏的结果如下。12)所有MFC类的动态创建宏内,都隐藏了两个成员函数和一个静态成员变量,如图13-22所示。图13-24 添加工具栏按钮消息映射函数15)编写代码,测试动态创建函数CRuntimeClass::CreateObject。......
2023-11-25
动画素材可以由美工提供或在网上搜索GIF动画素材,使用GIF动画拆分精灵等软件,可以将动画文件中的每一帧拆分成一个位图文件。创建一个工程名为“Ani”的对话框程序,演示播放一幅GIF动画图片。3)在主对话框类中,添加一个内存DC的数组用于保存12帧动画图片。图8-13 将MemDC.h文件添加到编译列表图8-14 添加WM_TIMER消息映射函数6)修改消息映射函数OnTimer代码,每隔64ms播放一帧动画图片。......
2023-11-25
一般画面都是矩形,选用了CRgn修饰的画面输出之后,画面就被剪切成不规则的形状。CRgn类的主要成员见表7-7。表7-7 CRgn类的主要成员创建一个工程名为“Rgn”的对话框程序,用于演示选择区域后的画面输出效果。图7-23 查看运行结果3)在OnPaint函数的末尾添加两行代码,将两个不规则区域合并后设置窗口的形状。rg1.CombineRgn;SetWindowRgn;4)为了让窗口形状和画面一致,修改主对话框的边框为“None”,如图7-24所示。图7-25 添加WM_NCHITTEST消息映射函数6)修改消息映射函数代码。......
2023-11-25
在本章第5节中,通过“Win32 Application”建立的MFC32工程,目的是为了演示MFC工程的架构原理。一个MFC工程必须包含一个CWinApp的派生类,并定义一个派生类的全局变量theApp,最后重写InitInstance虚函数用于处理进程启动过程。本节直接通过“MFC AppWizard”来创建MFC工程,用于对照以上说明的MFC必备因素。图3-54 程序向导生成的代码图3-55 MFC类向导在Class name下拉列表中选择CTestMFCDlg类,在Member functions列表框中显示4个已添加的回调函数。......
2023-11-25
互联网网络通信的基础是TCP/IP,即传输控制协议和网络互联协议。按照TCP/IP规定,32位IP地址用4个字节来表示,例如,“192.168.1.100”。图15-1 通过命令查看本机网络配置在“本地连接”的属性设置对话框中,双击“Internet协议”,如图15-2所示。图15-2 查看网络邻居属性图15-3 TCP/IP属性设置在TCP/IP中计算机软件通信必须依赖于通信端口,端口号的范围是0~65535。......
2023-11-25
相关推荐