MFC window讯息驱动,映射关系详解。(MFC入门资料)

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、在为控件添加变量时,如果想用人工的方法,可以先在为控件添加个普通变量,把下面那个控件变量除掉就行了。

  MFC window讯息驱动,映射关系详解。(MFC入门资料)  

因为我之前已经添加了,所以他那个变量名会变 暗。

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();
                     }

      非模式对话框创建和销毁编写完成。