zoukankan      html  css  js  c++  java
  • VC中自定义消息响应函数

    这是从新对windows的自定义消息响应函数进行整理。因为我发现自定义消息响应函数还是非常有用的,尤其是在windows多编程中,用的类越多,有时候就比较有用。

    Windows消息用"WM_"这个前缀,自定义的消息一般用"UM_这个前缀"。

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    1.建立响应函数的原型:
    在VS2005中,对于响应函数有了个比较严格的规定,导致以前VC6里面有很多不能直接使用,原型如下:

    Cpp代码 
    1. afx_msg LRESULT (CWnd::)MyFnx(WPARAM wParam,LPARAM lParam)  

    对于返回类型与参数都不能少。将响应函数添加在头文件当中:

    Cpp代码 
    1. ......     
    2. // 生成的消息映射函数     
    3. protected:     
    4. ......     
    5. afx_msg LRESULT MyFnx(WPARAM wParam, LPARAM lParam);     
    6. ......     
    7. DECLARE_MESSAGE_MAP()     
    8. ......    

    2.定义消息:
    在类的头文件中添加一个自定义的消息:

    Cpp代码 
    1. #define UM_MYMSG WM_USER+1  

    这样UM_MYMSG就是对应的消息。
    3.将消息映射到响应函数:
    在类的源文件中添加映射关系:

    Cpp代码 
    1. .......     
    2. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)     
    3. ......     
    4. ON_MESSAGE(UM_MYMSG,MyFnx)     
    5. ......     
    6. END_MESSAGE_MAP()     
    7. ......   

    4.响应函数的具体实现:
    在源文件中添加上成员函数MyFnx的具体实现:

    Cpp代码 
    1. LRESULT CWnd::MyFnx(WPARAM wParam, LPARAM lParam)     
    2. {     
    3. ......     
    4. }   

    5.在需要使用到该函数的地方发出消息

    Cpp代码
      1. PostMessage(MY_MSG,wParam,lParam);     
      2. //将消息加入等待队列,不会马上执行     
      3. //SendMessage(MY_MSG,wParam,lParam)则不同,会马上执行 

    ////////////////////////////////////////////////////////////

    下面我们举一个实际的例子来说明该段过程.例如在对话框中设置一个按钮,每隔3秒钟会自动的弹出Message对话框:

    (1)首先在头文件或CPP文件中定义一个消息

    #define CLICK_MESSAGE_BOX  WM_USER+100
    

     (2)然后在消息映射宏里面添加函数声明:

    	//{{AFX_MSG(CMy41Dlg)
    	virtual BOOL OnInitDialog();
    	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	afx_msg void OnButton1();
    	afx_msg void OnTimer(UINT nIDEvent);
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    	afx_msg void OnResponse(int num);
    

     我们一般将自定义的消息卸载AFX_MSG的外面

    (3)在CPP文件里面将消息和消息响应函数链接:

    BEGIN_MESSAGE_MAP(CMy41Dlg, CDialog)
    	//{{AFX_MSG_MAP(CMy41Dlg)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
    	ON_WM_TIMER()
    	ON_MESSAGE (CLICK_MESSAGE_BOX,OnResponse)//
    	//}}AFX_MSG_MAP
    
    	
    END_MESSAGE_MAP()
    

     (4)定义响应函数

    void CMy41Dlg::OnResponse(int num)
    {
    	CString str;
    	str.Format("%d",num);
    	MessageBox(str+"自定义的消息响应函数");
    }
    

     (5)发送消息:

    PostMessage(CLICK_MESSAGE_BOX,1);
    

     需要注意的是,PostMessage函数后面带有参数,可以向响应函数里面传参,例如上面的例子中,我们在(5)的消息函数中有一个int num,其实就是postMessage函数传过来的参数1。 

  • 相关阅读:
    part11-1 Python图形界面编程(Python GUI库介绍、Tkinter 组件介绍、布局管理器、事件处理)
    part10-3 Python常见模块(正则表达式)
    Cyclic Nacklace HDU
    模拟题 Right turn SCU
    状态DP Doing Homework HDU
    Dp Milking Time POJ
    区间DP Treats for the Cows POJ
    DP Help Jimmy POJ
    Dales and Hills Gym
    Kids and Prizes Gym
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/2504073.html
Copyright © 2011-2022 走看看