MFC的内部总共有六大关键技术,架构起了整个MFC的开发平台。
MFC的六大关键技术包括:
a)MFC程序的初始化过程;
b)消息映射机制;
c)运行时类型识别(RTTI);
d)动态创建;
e)永久保存;
f)消息传递。
{六大关键技术的目的是为了提高开发效率,开发者只要在局部做简单地修改,即可处理大部分窗口事物。}
四:消息映射机制
Win32工程的消息处理机制,就是每个窗口都关联一个全局的消息回调函数。再在消息回调函数中,通过对各种不同消息类型识别和分流来响应不同的消息。MFC的消息处理不使用全局的回调函数,而是创建一个与窗口关联的派生类,用与消息关联的成员函数来接收和处理窗口的消息。在类向导中选择对应的消息,添加与该消息关联的成员函数来处理该消息,这就是MFC的消息映射机制。
在Win32的消息处理机制中,每一个消息类型(uMsg)发送到窗口内时,可能在wParam和lParam中携带一些相关的数据。例如:WM_COMMAND的消息中,在wParam中记录了点击的按钮或者菜单项等的ID号码。而在WM_LBUTTONDOWN的消息中,在lParam中记录了点击界面的(x,y)坐标等等。Win32解析这些附带数据的过程比较繁琐,需要阅读MSDN手册中详细的说明资料。
MFC的消息映射机制,一般不需要开发者解析这些复杂的数据,因为消息映射函数中会自动在参数中将解析好的数据传递过来。例如:OnMouseMove(UINT nFlags, CPoint point)函数,再简单参照MSDN说明即可轻而易举地进行消息处理。
Windows常用消息
窗口创建时的消息和虚函数包括:WM_CREATE,WM_INITDIALOG,和PreSubclassWindow等;窗口关闭时的消息和虚函数:WM_CLOSE,WM_DESTROY以及OnOK和OnCancel等。有些消息是所有窗口都通用的,例如:WM_CREATE、WM_CLOSE和WM_DESTROY等。有些消息和虚函数是对话框专用的回调函数,例如:WM_INITDIALOG消息以及OnOK、OnCancel等虚函数。
通过MSDN的说明可以查看到,WM_CREATE和WM_INITDIALOG都是是窗口刚创建时的回调消息,当窗口还未显示出来之前,对窗口做预先处理的回调函数。WM_CREATE是所有窗口通用的创建时回调消息,用于包括对话框、MDI或者SDI等任何窗口的初始化,对应的消息映射函数是OnCreate。可以在该函数中编写代码,在窗口刚创建还未显示时,修改父窗口属性或者创建内部子窗口。WM_INITDIALOG对话框是对话框专用消息,最常用来初始化对话框及其内部控件,对应的消息映射函数是OnInitDialog。这个函数内部第一行一般是先执行基类函数CDialog::OnInitDialog,基类函数执行过程会将所有对话框资源模板内的控件都创建完毕。因此可以在该函数中,编写代码来对子窗口的做初始化设置。
消息传递函数
1、SendMessage和PostMessage函数都是消息传递函数,两个函数的格式:
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
2、SendMessage和PostMessage这两个函数消息的区别是:
a)返回值类型不同:两个函数的4个参数的意义是一样的,只有返回值类型不同(其实从数据上看他们一样是一个 32 位的数,只是意义不一样),LRESULT 表示的是消息被处理后的返回值,BOOL 表示的是消息是不是传递成功。
b)PostMessage 是异步的,SendMessage 是同步的。PostMessage 只把消息放入窗口消息队列中,不管消息被处理后的结果就返回;而SendMessage等待消息被处理完了之后才返回。
c)如果在同一个线程内,常常使用SendMessage发送消息时,速度快并能得到返回的消息处理结果。在不同线程或者进程之间,一般使用PostMessage 发送消息,把消息先放入目标窗口的消息队列中,然后由目标窗口通过消息循环自行派发处理。
{
、SendMessage和PostMessage函数的功能:
a)能够向指定的窗口内发送窗口消息,既可以是本进程内窗口也可以是其他进程的;
b)既可以发送系统内部消息,消息编号的范围是:1-WM_USER-1;
例如:WM_LBUTTONDOW,WM_MOUSEMOVE等;
c)也可以发送非系统消息(开发者定义的消息),范围是WM_USER-0x7FFF。
d)在MFC下非系统消息映射,使用宏定义时ON_MESSAGE
三、SendMessage和PostMessage两个函数的区别是:
a)SendMessage是阻塞型函数,PostMessage是非阻塞型函数:
SendMessage用于调用指定窗口的内部程序,直到窗口程序处理完成以后再返回;
PostMessage是将一个消息寄送到一个窗口内的消息队列后就立即返回。
b)两个函数的返回值不同:
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
SendMessage的返回值是消息处理结果产生的数值,依赖于消息处理函数;
PostMessage的返回值是返送成功或失败,一般很少失败除非窗口不存在;
c)跨线程或跨进程发送消息,推荐使用PostMessage函数
}
CEdit类成员
主要成员 | 成员说明 |
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); | 创建编辑控件, 并将其窗口句柄把保存在m_hWd中 |
void Clear( ); | 清空编辑框中的文字 |
void Copy( ); | 复制选中的文字到剪切板中 |
void Cut( ); | 剪切选中的文字到剪切板中 |
void Paste( ); | 将剪切板内的文字粘贴到编辑框中 |
BOOL Undo( ); | 撤销上一次操作 |
BOOL CanUndo( ) const; | 是否可以撤销 |
void GetSel( int& nStartChar, int& nEndChar ) const; | 获取被选中文字的起始位置 |
DWORD GetSel( ) const; | 获取被选中文字的起始位置 |
void SetSel( int nStart, int nEnd, BOOL bNoScroll = FALSE ); | 设置被选中文字的起始位置 |
void ReplaceSel( LPCTSTR lpszNewText, BOOL bCanUndo = FALSE ); | 用指定文字替换被选中的文字 |
int GetLineCount( ) const; | 获取多行编辑控件中的文字行数 |
void SetModify( BOOL bModified = TRUE ); | 设置或清除修改标记 |
BOOL GetModify( ) const; | 获取内容是否被修改的标记 |
五:MFC的架构组成
MFC所有封装类一共200多个,但是MFC的内部技术不只是简单的封装。MFC的内部总共有六大黑箱技术架构起整个MFC的开发平台。六大关键技术的目的是为了提高开发效率,开发者只要在局部做简单地修改,即可处理大部分窗口事物。
1、MFC的六大关键技术包括:MFC程序的初始化过程、运行时类型识别(RTTI)、动态创建、永久保存、消息映射和消息传递。
2、不借助“MFC AppWizard”手工建立MFC程序只需几个步骤:
a)从CWinApp类派生一个应用程序类;
b)使用派生类定义的全局变量(theApp);
c)在预定义头文件“”中,禁用“windows.h”取而代之afx开头的MFC头文件;
d)编译设置中选择用“Use MFC in a Static Library”;
e)在CWinApp生类中,重写InitInstance函数作为程序启动代码。
1.《mfc如何关闭调用的对话框 mfc如何显示对话框》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《mfc如何关闭调用的对话框 mfc如何显示对话框》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/3293342.html