首先,因为需要用到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;
}