• 发送消息 MFC 消息映射


    发送消息 MFC 消息映射

     (2011-07-11 17:03:49)
    标签: 

    发送消息

     

    mfc

     

    消息映射

     

    杂谈

     

    1、在用WIN 32 API函数开发应用程序时,经常要用SendMassege函数向某些对象发送消息,以让对象实现某些功能(此时也有相应的API

    函数来实现这个功能)。例如关闭窗口,可以发送WM_CLOSE消息。
    SendMessage(hwnd,WM_SYSCOMMAND,SC_CLOSE,0);//关闭主窗口
    SendMessage(hwnd,WM_CLOSE,0,0);//关闭普通窗口
    2、示例1--发送WM_COPYDATA消息(即WM_COPYDATA消息在两个进程之间的传递)
     在做这个例子之前,我们先了解一下,WM_COPYDATA消息对应的结构体COPYDATASTRUCT
    typedef struct tagCOPYDATASTRUCT{
     DWORD dwData;//接收数据的句柄
     DWORD cbData;//数据的大小
     PVOID lpData;//数据指针
    }COPYDATASTRUCT;


    主程序端:
    建立MFC对话框工程,添加编辑框和一个按钮
    在按钮单击事件函数中添加后:
    void CMyDlg::OnButton1()
    {
     // TODO: Add your control notification handler code here
     HWND  hwnd=::FindWindow(NULL,"接受窗口");//找到我们要发送消息的窗口句柄
     if(hwnd==NULL)
     {
      AfxMessageBox("没有找到接受窗口");
      return;
     }
     CString msgedit; //声明我们要发送的消息
     GetDlgItem(IDC_EDIT1)->GetWindowText(msgedit);//获得编辑框内容,赋给msgedit
     COPYDATASTRUCT data={0};  //初始化COPYDATASTRUCT结构体对象
     data.dwData=(DWORD)this->GetSafeHwnd(); //接收数据的句柄
     data.cbData=msgedit.GetLength(); //数据的大小
     data.lpData=msgedit.GetBuffer(msgedit.GetLength()); //数据指针
     ::SendMessage(hwnd,WM_COPYDATA,(WPARAM)this->GetSafeHwnd(),(LPARAM)&data);//发送消息
    }

    接收窗口:
    建立MFC对话框工程,添加编辑框
    为对话框添加一个WM_COPYDATA消息响应
    编辑代码过后如下:

    BOOL CMyDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
     //函数接口包括:窗口句柄和COPYDATASTRUCT结构体指针,分别对应WPARAM,LPARAM
    {
     // TODO: Add your message handler code here and/or call default
     char msgdata[256];//声明接受的消息
     DWORD size= pCopyDataStruct->cbData; //数据大小
     CopyMemory(msgdata,pCopyDataStruct->lpData,size);//通过数据指针,复制内容
     msgdata[size]=''; //给数组添加结束标志
     GetDlgItem(IDC_EDIT1)->SetWindowText(msgdata);//给编辑框设置内容
     return CDialog::OnCopyData(pWnd, pCopyDataStruct);//返回是否成功
    }
    3、示例2--发送自己注册的消息
    本示例先通过RegisterWindowMessage函数来注册一条消息,然后用Win32 API函数SendMessage()发送。
    主程序端:
    建立MFC对话框,添加一个按钮
    在对话框CPP文件预处理下加入下面代码:
    static UINT NEAR WM_RGSMSG=RegisterWindowMessage("MESSAGE");//注册一条发送MESSAGE的自己注册的消息
    在按钮单击事件函数中添加后:
    void CMyDlg::OnButton1()
    {
     // TODO: Add your control notification handler code here
     HWND  hwnd=::FindWindow(NULL,"接受窗口");//找到我们要发送消息的窗口句柄
     if(hwnd==NULL)
     {
      AfxMessageBox("没有找到接受窗口");
      return;
     }
     else
      ::SendMessage(hwnd,WM_RGSMSG,1,0);//发送消息
    }


    本示例接受方,仍然是先通过RegisterWindowMessage函数来注册一条相同的消息,然后定义消息宏,绑定处理函数
    接收窗口:
    建立MFC对话框工程
    在对话框CPP文件预处理下加入下面代码:
    static UINT NEAR WM_RGSMSG=RegisterWindowMessage("MESSAGE");//注册一条发送MESSAGE的自己注册的消息
    在消息宏声明处
    将消息声明为:
    afx_msg LRESULT OnRgsmsg(WPARAM wParam,LPARAM lparam);    //声明消息映射函数
    在建立消息映射表的地方添加如下代码:
    ON_REGISTERED_MESSAGE(WM_RGSMSG,OnRgsmsg)//注册的消息宏应放在这个位置
    在CPP文件中,添加函数定义,代码如下:
    LRESULT CMyDlg::OnRgsmsg(WPARAM wParam,LPARAM lParam)
    {
     AfxMessageBox("接收到消息");
     return TRUE;
    }

  • 相关阅读:
    一定间隔时间下重复执行一个函数的几个方法
    关于 MonoDevelop on Linux 单步调试问题的解决
    MonoDevelop 4.2.2/Mono 3.4.0 in CentOS 6.5 安装笔记
    在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录
    在CentOS 6.4 x86_32中使用Rhythmbox听MP3
    MonoDevelop 4.0.9 on CentOS 6.3 安装笔记
    MemoryMappedFile 在 Mono in Linux 的开发笔记
    Mono on CentOS 6.3 安装笔记
    庆祝下:iOS 开发者企业级计划(299美元/年帐户+邓白氏码免费) 和 Windows Phone公司应用(公司帐户99美元+Symantec企业证书299美元/年))顺利发布成功
    PowerDesigner中NAME和COMMENT的互相转换,需要执行语句
  • 原文地址:https://www.cnblogs.com/jack-jia-moonew/p/4236041.html
Copyright © 2020-2023  润新知