vc2008中使用SendMessage正确发送自定义消息的方法

首先,因为需要用到SendMessage这个函数,在此做一介绍:


一、SendMessage(

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

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

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

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

    LPARAMlParam); //参数2

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

//typedef unsigned int UINT;

//typedef UINT WPARAM;

//typedef LONG LPARAM;

//typedef LONG LRESULT;


二、使用SendMessage。这里以文档-视图类框架进行说明

WM_USER+1   //do something

void CTScrollWinView::OnLButtonDblClk(UINT nFlags, CPoint point)
       {
            // 
          ::SendMessage(AfxGetMainWnd()->m_hWnd,WM_CHILDFRAMEDBCLK ,0,0);
           CScrollView::OnLButtonDblClk(nFlags, point);
       }
注意了这里用
AfxGetMainWnd()->m_hWnd //获得框架,也就是消息接受对象的句柄
使用GetParent()->m_hWnd则一定正确,因为你不知道是不是发给”父窗口“


三、在接受消息的窗口进行如下定义和编码

LRESULTCMainFrame::OnChlidFrameDBClick(WPARAM wParam, LPARAMlParam)
#define WM_CHILDFRAMEDBCLK  WM_USER+1   //do something

afx_msg LRESULTOnChlidFrameDBClick(WPARAM wParam, LPARAM lParam); //注意一定要有这两个参数,否则或出现各种问题,
如在debug模式下可以通过,在release模式无法通过。在VC6中的debug模式下,不需要这两个参数也能正确运行!!! 但VC2008显然不行!!

//消息映射
ON_MESSAGE(WM_CHILDFRAMEDBCLK,OnChlidFrameDBClick)

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
       ON_WM_CREATE()
       ON_COMMAND(ID_FullScreen, OnViewFullscreen)
       ON_MESSAGE(WM_CHILDFRAMEDBCLK,OnChlidFrameDBClick)   // 映射添加到这里
END_MESSAGE_MAP()

消息处理函数:
LRESULTCMainFrame::OnChlidFrameDBClick(WPARAM wParam, LPARAMlParam)
{
    CancelFullScreenWin();  //如:取消全屏
    return 0;
}


                                                           



你可能感兴趣的:(vc2008中使用SendMessage正确发送自定义消息的方法)