18 个解决方案
#1
在这样的情况下,如何让子窗口还能相应 WM_LBUTTONDOWN 消息?
#2
估计是父窗体获取了吧,
在父窗体里获取到然后发消息给子窗体
BOOL CClassRoomDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_LBUTTONDOWN)
{
子窗体->sendmessage(pMsg->message,pMsg->wParam,pMsg->lParam);
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
在父窗体里获取到然后发消息给子窗体
BOOL CClassRoomDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_LBUTTONDOWN)
{
子窗体->sendmessage(pMsg->message,pMsg->wParam,pMsg->lParam);
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
#3
可以在父窗口加上,看看是否这样,如果是就可以+++
#4
你的子窗口的WM_ACTIVATE里怎么处理的?
#5
这样怎么可以,岂不把父窗体的消息也发给子窗体了。
#6
case WM_ACTIVATE:
if(WA_INACTIVE != LOWORD(wParam))
SetActiveWindow(hParentWnd);
return FALSE;
但是子窗体能相应 WM_LBUTTONUP 消息,这又是为什么呢?
#7
各个窗体都加上 WM_LBUTTONDOWN 加调试语句或者断点之,然后运行,
然后点鼠标左键,然后看哪个有响应,就知道 WM_LBUTTONDOWN 哪里去了。。
然后点鼠标左键,然后看哪个有响应,就知道 WM_LBUTTONDOWN 哪里去了。。
#8
我猜是否是 左键按下,激活了 子窗体,然后松键的时候,UP就传给 子窗体了。
#9
你的子窗口是Child属性吗?
#10
是不是鼠标按下的时候激活子窗口的WM_ACTIVATE,然后激活父窗口,鼠标事件让父窗口捕获了
#11
子窗体是这样创建的
注册子窗体类:
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)ChildWinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WGIDEMO));
wc.hCursor = NULL;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = szClassName;
RegisterClass(&wc);
创建子窗体:
CreateWindowEx(0, szClassName, szWindowName, WS_POPUP, 0, 0, 0, 0,
hParentWnd, NULL, hInstance, NULL);
#12
程序就有一个父窗体和一个子窗体,刚才试了,点击子窗体时,父窗体也没有相应这个 WM_LBUTTONDOWN 消息。这个 WM_LBUTTONDOWN 哪里去了?奇怪~
#13
自己顶呀
#14
消息只会发到窗口对应的消息队列,你可以尝试测试WM_MOUSEMOVE,
在消息响应函数中,进行TRACE,就会发现这个问题。
在消息响应函数中,进行TRACE,就会发现这个问题。
#15
子窗口的PreTranslateMessage回收到消息的,在那里处理吧
#16
你先看看是不是父窗口收到了消息,如果是的画,弄弄窗口指针能解决问题
#17
把你的WS_POPUP属性换成WS_CHILD属性
#18
#1
在这样的情况下,如何让子窗口还能相应 WM_LBUTTONDOWN 消息?
#2
估计是父窗体获取了吧,
在父窗体里获取到然后发消息给子窗体
BOOL CClassRoomDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_LBUTTONDOWN)
{
子窗体->sendmessage(pMsg->message,pMsg->wParam,pMsg->lParam);
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
在父窗体里获取到然后发消息给子窗体
BOOL CClassRoomDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_LBUTTONDOWN)
{
子窗体->sendmessage(pMsg->message,pMsg->wParam,pMsg->lParam);
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
#3
可以在父窗口加上,看看是否这样,如果是就可以+++
#4
你的子窗口的WM_ACTIVATE里怎么处理的?
#5
这样怎么可以,岂不把父窗体的消息也发给子窗体了。
#6
case WM_ACTIVATE:
if(WA_INACTIVE != LOWORD(wParam))
SetActiveWindow(hParentWnd);
return FALSE;
但是子窗体能相应 WM_LBUTTONUP 消息,这又是为什么呢?
#7
各个窗体都加上 WM_LBUTTONDOWN 加调试语句或者断点之,然后运行,
然后点鼠标左键,然后看哪个有响应,就知道 WM_LBUTTONDOWN 哪里去了。。
然后点鼠标左键,然后看哪个有响应,就知道 WM_LBUTTONDOWN 哪里去了。。
#8
我猜是否是 左键按下,激活了 子窗体,然后松键的时候,UP就传给 子窗体了。
#9
你的子窗口是Child属性吗?
#10
是不是鼠标按下的时候激活子窗口的WM_ACTIVATE,然后激活父窗口,鼠标事件让父窗口捕获了
#11
子窗体是这样创建的
注册子窗体类:
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)ChildWinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WGIDEMO));
wc.hCursor = NULL;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = szClassName;
RegisterClass(&wc);
创建子窗体:
CreateWindowEx(0, szClassName, szWindowName, WS_POPUP, 0, 0, 0, 0,
hParentWnd, NULL, hInstance, NULL);
#12
程序就有一个父窗体和一个子窗体,刚才试了,点击子窗体时,父窗体也没有相应这个 WM_LBUTTONDOWN 消息。这个 WM_LBUTTONDOWN 哪里去了?奇怪~
#13
自己顶呀
#14
消息只会发到窗口对应的消息队列,你可以尝试测试WM_MOUSEMOVE,
在消息响应函数中,进行TRACE,就会发现这个问题。
在消息响应函数中,进行TRACE,就会发现这个问题。
#15
子窗口的PreTranslateMessage回收到消息的,在那里处理吧
#16
你先看看是不是父窗口收到了消息,如果是的画,弄弄窗口指针能解决问题
#17
把你的WS_POPUP属性换成WS_CHILD属性