子窗口怎么不响应 WM_LBUTTONDOWN 消息了?

时间:2022-11-17 19:39:18
在子窗口的 WM_ACTIVATE 消息处理中用 SetActiveWindow 函数激活父窗口后,在子窗口上点击鼠标左键,子窗口怎么不响应 WM_LBUTTONDOWN 消息了?

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);
}

#3


引用 2 楼 candy_o 的回复:
估计是父窗体获取了吧,
在父窗体里获取到然后发消息给子窗体
BOOL CClassRoomDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_LBUTTONDOWN)
{
  子窗体->sendmessage(pMsg->message,pMsg->wParam,pMsg->lParam);
  return TRU……

可以在父窗口加上,看看是否这样,如果是就可以+++

#4


你的子窗口的WM_ACTIVATE里怎么处理的?

#5


引用 2 楼 candy_o 的回复:
估计是父窗体获取了吧,
在父窗体里获取到然后发消息给子窗体
BOOL CClassRoomDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_LBUTTONDOWN)
{
  子窗体->sendmessage(pMsg->message,pMsg->wParam,pMsg->lParam);
  return TRUE……


这样怎么可以,岂不把父窗体的消息也发给子窗体了。

#6


引用 4 楼 visualeleven 的回复:
你的子窗口的WM_ACTIVATE里怎么处理的?


case WM_ACTIVATE:   
     if(WA_INACTIVE != LOWORD(wParam))
   SetActiveWindow(hParentWnd); 
     return FALSE;


但是子窗体能相应 WM_LBUTTONUP 消息,这又是为什么呢?

#7


各个窗体都加上 WM_LBUTTONDOWN 加调试语句或者断点之,然后运行,
然后点鼠标左键,然后看哪个有响应,就知道 WM_LBUTTONDOWN 哪里去了。。

#8


引用 6 楼 rzcy123 的回复:
但是子窗体能相应 WM_LBUTTONUP消息,这又是为什么呢?

我猜是否是 左键按下,激活了 子窗体,然后松键的时候,UP就传给 子窗体了。

#9


你的子窗口是Child属性吗?

#10


是不是鼠标按下的时候激活子窗口的WM_ACTIVATE,然后激活父窗口,鼠标事件让父窗口捕获了

#11


引用 9 楼 visualeleven 的回复:
你的子窗口是Child属性吗?



子窗体是这样创建的

注册子窗体类:

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


引用 7 楼 sophyyoung 的回复:
各个窗体都加上 WM_LBUTTONDOWN 加调试语句或者断点之,然后运行,
然后点鼠标左键,然后看哪个有响应,就知道 WM_LBUTTONDOWN 哪里去了。。


程序就有一个父窗体和一个子窗体,刚才试了,点击子窗体时,父窗体也没有相应这个 WM_LBUTTONDOWN 消息。这个 WM_LBUTTONDOWN 哪里去了?奇怪~

#13


自己顶呀

#14


消息只会发到窗口对应的消息队列,你可以尝试测试WM_MOUSEMOVE,
在消息响应函数中,进行TRACE,就会发现这个问题。

引用 12 楼 rzcy123 的回复:
引用 7 楼 sophyyoung 的回复:
各个窗体都加上 WM_LBUTTONDOWN 加调试语句或者断点之,然后运行,
然后点鼠标左键,然后看哪个有响应,就知道 WM_LBUTTONDOWN 哪里去了。。


程序就有一个父窗体和一个子窗体,刚才试了,点击子窗体时,父窗体也没有相应这个 WM_LBUTTONDOWN 消息。这个 WM_LBUTTONDOWN 哪里去了?奇怪~

#15


子窗口的PreTranslateMessage回收到消息的,在那里处理吧

#16


你先看看是不是父窗口收到了消息,如果是的画,弄弄窗口指针能解决问题

#17


引用 11 楼 rzcy123 的回复:
引用 9 楼 visualeleven 的回复:
你的子窗口是Child属性吗?



子窗体是这样创建的

注册子窗体类:

WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)ChildWinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra =……

把你的WS_POPUP属性换成WS_CHILD属性

#18


该回复于2012-02-23 09:11:50被版主删除

#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);
}

#3


引用 2 楼 candy_o 的回复:
估计是父窗体获取了吧,
在父窗体里获取到然后发消息给子窗体
BOOL CClassRoomDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_LBUTTONDOWN)
{
  子窗体->sendmessage(pMsg->message,pMsg->wParam,pMsg->lParam);
  return TRU……

可以在父窗口加上,看看是否这样,如果是就可以+++

#4


你的子窗口的WM_ACTIVATE里怎么处理的?

#5


引用 2 楼 candy_o 的回复:
估计是父窗体获取了吧,
在父窗体里获取到然后发消息给子窗体
BOOL CClassRoomDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_LBUTTONDOWN)
{
  子窗体->sendmessage(pMsg->message,pMsg->wParam,pMsg->lParam);
  return TRUE……


这样怎么可以,岂不把父窗体的消息也发给子窗体了。

#6


引用 4 楼 visualeleven 的回复:
你的子窗口的WM_ACTIVATE里怎么处理的?


case WM_ACTIVATE:   
     if(WA_INACTIVE != LOWORD(wParam))
   SetActiveWindow(hParentWnd); 
     return FALSE;


但是子窗体能相应 WM_LBUTTONUP 消息,这又是为什么呢?

#7


各个窗体都加上 WM_LBUTTONDOWN 加调试语句或者断点之,然后运行,
然后点鼠标左键,然后看哪个有响应,就知道 WM_LBUTTONDOWN 哪里去了。。

#8


引用 6 楼 rzcy123 的回复:
但是子窗体能相应 WM_LBUTTONUP消息,这又是为什么呢?

我猜是否是 左键按下,激活了 子窗体,然后松键的时候,UP就传给 子窗体了。

#9


你的子窗口是Child属性吗?

#10


是不是鼠标按下的时候激活子窗口的WM_ACTIVATE,然后激活父窗口,鼠标事件让父窗口捕获了

#11


引用 9 楼 visualeleven 的回复:
你的子窗口是Child属性吗?



子窗体是这样创建的

注册子窗体类:

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


引用 7 楼 sophyyoung 的回复:
各个窗体都加上 WM_LBUTTONDOWN 加调试语句或者断点之,然后运行,
然后点鼠标左键,然后看哪个有响应,就知道 WM_LBUTTONDOWN 哪里去了。。


程序就有一个父窗体和一个子窗体,刚才试了,点击子窗体时,父窗体也没有相应这个 WM_LBUTTONDOWN 消息。这个 WM_LBUTTONDOWN 哪里去了?奇怪~

#13


自己顶呀

#14


消息只会发到窗口对应的消息队列,你可以尝试测试WM_MOUSEMOVE,
在消息响应函数中,进行TRACE,就会发现这个问题。

引用 12 楼 rzcy123 的回复:
引用 7 楼 sophyyoung 的回复:
各个窗体都加上 WM_LBUTTONDOWN 加调试语句或者断点之,然后运行,
然后点鼠标左键,然后看哪个有响应,就知道 WM_LBUTTONDOWN 哪里去了。。


程序就有一个父窗体和一个子窗体,刚才试了,点击子窗体时,父窗体也没有相应这个 WM_LBUTTONDOWN 消息。这个 WM_LBUTTONDOWN 哪里去了?奇怪~

#15


子窗口的PreTranslateMessage回收到消息的,在那里处理吧

#16


你先看看是不是父窗口收到了消息,如果是的画,弄弄窗口指针能解决问题

#17


引用 11 楼 rzcy123 的回复:
引用 9 楼 visualeleven 的回复:
你的子窗口是Child属性吗?



子窗体是这样创建的

注册子窗体类:

WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)ChildWinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra =……

把你的WS_POPUP属性换成WS_CHILD属性

#18


该回复于2012-02-23 09:11:50被版主删除