MFC window讯息驱动,映射关系详解。(MFC入门资料)
一、讲下消息和映射
1、windows是用消息驱动的。用消息映射函数处理。
2、以WM开头的宏是 windows message 的简称,表示消息;类似的还有 IDD,是 ID of Dialog ,就是对话框ID。
3、消息分为四种,windows消息,控件通知消息,命令消息,自定义消息。
1)windows消息:是windows自身的,每个消息都有固定的处理函数名,在消息映射声明里面,直接声明消息加个括号就行了。函数里面可以添加自己的东西的(override,重写或叫做覆盖),千万不要被某些书误导认为是重载。
2)控件通知消息:就是你定义的一些控件,然后控件有控件的ID的,一般都是 ID_XXX_XXX 命名的,然后你添加控件的处理消息和消息的处理函数就对了。声明格式一般是写出它的消息,然后括号里面有个 ID,还有个处理函数的名称。然后你在头文件声明下那个处理函数的名称,在源文件里面加内容就行了,就是这三步曲。
3)命令消息:就是工具栏和菜单栏那些消息,用 ON_COMMAND 把ID ,消息处理函数 联系起来。
4) 自定义消息:自己定义的消息,用 ON_MESSAGE 联系 自己创建的消息名称 和 处理函数。到时用 sendMessage(你的消息) 来发送消息。关键是记得要在resource.h 里面添加你的消息的宏定义 。例如 #define WM_MYMESSAGE WM_USER+100 (操作系统将WM_USER(0x0400)到0x7FFF 的数保留给用户自定义消息)
BEGIN_MESSAGE_MAP(CMFCApplication2App, CWinApp)
ON_COMMAND(ID_APP_ABOUT, &CMFCApplication2App::OnAppAbout)
ON_COMMAND(ID_CONN_CHECK, &CMFCApplication2App::OnConnCheck) //这两个是命令消息
ON_WM_RBUTTONUP()
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONDOWN() //这三个是windows的消息
ON_BN_CLICKED(IDCANCEL, &CDIALOG1::OnBnClickedCancel)
ON_BN_CLICKED(IDOK, &CDIALOG1::OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON_CAL, &CDIALOG1::OnBnClickedButtonCal) //这三个是控件通知消息
ON_MESSAGE(WM_MYMESSAGE, &CMFCApplication2View::OnMymessage) //自定义的消息
END_MESSAGE_MAP()
注意:为了不用麻烦,一般我都会用 类向导 (classwizard)来对这些进行操作,直观方便。只不过自定义消息的时候不要忘记自己要在resource.h定义。
二、讲下控件和变量的映射
1、在为控件添加变量时,如果想用人工的方法,可以先在为控件添加个普通变量,把下面那个控件变量除掉就行了。
因为我之前已经添加了,所以他那个变量名会变 暗。
2、然后,在找到 DoDataExchange 成员函数,添加代码如下:
DDX_Text(pDX,IDC_EDIT_ZONGJIA,m_fzongjia); //这个是把控件ID和变量绑定的,DDX
DDV_MinMaxFloat(pDX,m_fzongjia,0.F,10000.F); //这个是表示变量的范围,DDV校验
DDX_Control(pDX, IDC_EDIT_ZONGJIA, m_ctrltotal); //这个是绑定,不过这个 m_ctrltotal 是对象,而不是值,要注意。
3、大功告成。
三、模式对话框和非模式对话框( modal & modeless )
1、模式对话框创建
CXXDIALOG text;
text.doModal();
/***************************************************/ 这样就可以了。
2、非模式对话框的创建与销毁
非模式对话框是要销毁的,为什么呢?因为它用的是指针。
创建过程: CXXDIALOG *text;
text->Create(IDD_XXX);//填你的对话框ID ,create也可以填两个参数,当然一个也可以。
text->ShowWindow(SW_SHOW);// SW_SHOW 就是标准状态,详情可查询MSDN。里面有很多值可以填,不仅仅是SW_SHOW,不同的style。
销毁过程:在OnBnClickedOk函数里面填写
if(UpdateData(TRUE)) DestroyWindow(); //其他可以删掉了。
在在OnBnClickedCancel函数里面填写
DestroyWindow();
要知道,DestroyWindow()会引发另一个消息,就是WM_NCDESTROY,而我们最终要把非模式对话框销毁,那么就要delete,从而可以在WM_NCDESTROY的处理函数里面添加处理方式。因为OnNcDestroy是WM_NCDESTROY这个消息的处理函数,而OnNcDestroy在最后会调用PostNcDestroy来做一些清理工作,即在PostNcDestroy函数来添加动作即可。用类向导,重写PostNcDestroy这个虚函数,如下:
void CDIALOG1::PostNcDestroy()
{
delete this; //只有这句是自己写的。
CDialogEx::PostNcDestroy();
}