MFC中SendMessage的用法与相应函数的添加;

1. 先来个基本知识介绍

SendMessage的基本结构如下:

SendMessage(

    HWND hWnd,  //消息传递的目标窗口或线程的句柄。

    UINT Msg, //消息类别(这里可以是一些系统消息,也可以是自己定义,下文具体介绍,)

    WPARAM wParam, //参数1 (WPARAM 其实是与UINT是同种类型的,

  //在vc编译器中右键有个“转到WPARAM的定义”的选项可以查看。

    LPARAM lParam); //参数2

其中一些参数的由来如下:

//typedef unsigned int UINT;

//typedef UINT WPARAM;

//typedef LONG LPARAM;

//typedef LONG LRESULT;

2.  SendMessage用法实例

    例如可以用以下语句:

void CTScrollWinView::OnLButtonDblClk(UINT nFlags, CPoint point)
       {
            // TODO: 在此添加消息处理程序代码和/或调用默认值

     ::SendMessage(AfxGetMainWnd()->m_hWnd,WM_CHILDFRAMEDBCLK ,0,0);

     CScrollView::OnLButtonDblClk(nFlags, point);
       }

这是我用VC2008下建立的一个多文档选项卡式工程里面的一段代码,是为了实现在子窗口双击后发送一个不带参数的消息(其ID为WM_USER+1)给主窗口, 如上为部分代码, 其中WM_CHILDFRAMEDBCLK是自定义的消息ID, AfxGetMainWnd()->m_hWnd是获得主窗口(这里不能使用GetParent()->m_hWnd或者GetParentFrame()->m_hWnd, 因为这是获得父窗口,但父窗口不一定是主窗口,一定要注意,不然消息就会发错导致接收不到,我这里卡了半天,后来在QQ群里一位大侠告诉我的,在此再感谢一下那位大侠);

3. 在接收消息的窗体以及线程所在的头文件里定义:

#define WM_CHILDFRAMEDBCLK  WM_USER+1   // do something

4. 然后接下来定义一个消息需要映射的函数,如下:

afx_msg LRESULT OnChlidFrameDBClick(WPARAM wParam, LPARAM lParam);

注意格式必须是:两个参数必不可少,返回类型一定为LRESULT,网上很多文章都忽略了这两点,这也是网上文章普遍错误的地方。

5. 添加消息函数映射

    ON_MESSAGE(WM_CHILDFRAMEDBCLK,OnChlidFrameDBClick)

    注意这里必须是ON_MESSAGE, 不能使用ON_COMMAND, 前者主要针对用户自定义消息,后者针对

WM_COMMAND命令,比如菜单、工具栏等.

6. 实现消息函数:

我们在接收窗体里定义一个这样的事情(过程),

LRESULT CMainFrame::OnChlidFrameDBClick(WPARAM wParam, LPARAM lParam)
      {
            CancelFullScreenWin();  // 这里调用了一个使子窗口全屏的自写函数,我就不贴出来了,以后专题将的时候会提到

      return 0;
      }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]:SendMessage用于调用指定窗口的内部程序,直到窗口程序处理完成以后再返回; PostMessage是将一个消息寄送到一个窗口内的消息队列后就立即返回。\[1\]两个函数的返回值不同: LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);\[1\]引用\[2\]:本示例先通过RegisterWindowMessage函数来注册一条消息,然后用Win32 API函数SendMessage()发送。\[2\]主程序端: 建立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);//发送消息 }\[2\]引用\[3\]:SendMessage函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。\[3\] 问题: MFC SendMessage函数和PostMessage函数有什么区别? 回答: MFCSendMessage函数和PostMessage函数都用于向指定窗口发送消息,但它们有几个区别。首先,SendMessage函数会调用指定窗口的内部程序,并在窗口程序处理完消息后才返回,而PostMessage函数则是将消息寄送到窗口的消息队列后立即返回。\[1\]其次,两个函数的返回值不同,SendMessage函数的返回值是LRESULT类型,而PostMessage函数的返回值是BOOL类型。\[1\]最后,使用SendMessage函数发送消息时,需要确保目标窗口存在并且可用,否则会返回错误信息。而使用PostMessage函数发送消息时,即使目标窗口不存在或不可用,也不会返回错误信息。\[3\] #### 引用[.reference_title] - *1* [【MFCSendMessage与PostMessage](https://blog.csdn.net/qq_45662588/article/details/121417438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [MFCSendMessage函数详解](https://blog.csdn.net/NUPTboyZHB/article/details/7370463)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值