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。 

  • 相关阅读:
    使用MobaXterm远程连接Ubuntu,启动Octave,界面不能正常显示
    ABP .Net Core 日志组件集成使用NLog
    ABP .Net Core Entity Framework迁移使用MySql数据库
    ABP前端使用阿里云angular2 UI框架NG-ZORRO分享
    阿里云 Angular 2 UI框架 NG-ZORRO介绍
    Visual Studio 2019 Window Form 本地打包发布猫腻
    VS Code + NWJS(Node-Webkit)0.14.7 + SQLite3 + Angular6 构建跨平台桌面应用
    ABP .Net Core 调用异步方法抛异常A second operation started on this context before a previous asynchronous operation completed
    ABP .Net Core To Json序列化配置
    .Net EF Core数据库使用SQL server 2008 R2分页报错How to avoid the “Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.”
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/2504073.html
Copyright © 2011-2022 走看看