小弟要实现如下功能:
有一个程序模块(dll):用WIN API创建了一个窗体,窗体有自己的消息循环.我现在将这个窗体铺(MoveWindow)到模块外的用MFC创建的窗体中。现在想将MFC创建的窗体消息窗过去。
需要的效果就是跟都用MFC创建时,用 OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) 传递消息一样的效果。
现在小弟不知用什么方法达到效果,请各位大虾帮帮忙。
谢过了!!
有一个程序模块(dll):用WIN API创建了一个窗体,窗体有自己的消息循环.我现在将这个窗体铺(MoveWindow)到模块外的用MFC创建的窗体中。现在想将MFC创建的窗体消息窗过去。
需要的效果就是跟都用MFC创建时,用 OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) 传递消息一样的效果。
现在小弟不知用什么方法达到效果,请各位大虾帮帮忙。
谢过了!!
问题是即使鼠标画过了子窗体,响应的消息事件还是在主窗体中响应。如果都用MFC创建的,一个简单的事件就可以实现(OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) )
这个事件它有自动消息过滤功能,会把合适的事件传递给子窗体。
如果用SendMessage或PostMessage当然可以传递消息,但不知怎么作??
是否可用这种方法解决:
在主窗体的消息循环中取出子窗体感兴趣的消息然后在发给子窗体,这样的子窗体就能响应了??
我做过实验,将主窗体的所有消息发给子窗体,子窗体是有响应的(比如鼠标移动),只不过CPU占了100%!!
下面时创建子窗体代码:
--------------------------------------------------------------------------
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = MyWndProc; // Window Procedure
wc.cbClsExtra = 0; // No per-class extra data.
wc.cbWndExtra = 0; // No per-window extra data.
wc.hInstance = m_pApp->m_instance; // Owner of this class
wc.hIcon = NULL;
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // Black color
wc.lpszMenuName = (const TCHAR *) NULL; // Menu name from .RC
wc.lpszClassName = VWR_WND_CLASS_NAME; // Name to register as
wc.hIconSm = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
if (!RegisterClassEx(&wc))
{
if (!RegisterClass((LPWNDCLASS)&wc.style))
return false;
}
DWORD winstyle = WS_CHILD|WS_VSCROLL | WS_HSCROLL |WS_VISIBLE | WS_CLIPCHILDREN;
CLIENTCREATESTRUCT ccsClientCreate;
ccsClientCreate.hWindowMenu = NULL;
ccsClientCreate.idFirstChild = 1;
m_hwnd = CreateWindowEx(
WS_EX_TOPMOST,
VWR_WND_CLASS_NAME,
_T("MYWIN"),
winstyle,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
g_hParentWnd,
NULL,
m_pApp->m_instance,
(LPVOID)&ccsClientCreate );
if(!m_hwnd)return false;
//子窗体平铺到主窗体的整个区域
::MoveWindow(m_hwnd,rc.left,rc.top,(rc.right - rc.left),(rc.bottom - rc.top),TRUE);
-----------------------------------------------------------------------
如果你要实现该功能,需要建立映射,使得函数FromHandlePermanent能够成功.也就可以使用MFC的传递机制了