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。 

  • 相关阅读:
    Codeforces Global Round 11
    2018-2019 ICPC, Asia Najing
    Codeforces Round #675 (Div. 2) ABCDE
    AtCoder Regular Contest 104 D(卡常)
    Navigator History Location
    键盘移动div
    键盘事件
    事件的传播
    事件的绑定
    事件的委派
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/2504073.html
Copyright © 2011-2022 走看看