鼠标下面子窗口响应滚轮消息 WM_MOUSEWHEEL,而不需要焦点,也不改变焦点。

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-29 03:00   11   0

转动滚轮会导致Windows在有输入焦点的窗口(不是鼠标光标下面的窗口)产生WM_MOUSEWHEEL消息。所以当子窗口没有焦点的时候将收不到消息WM_MOUSEWHEEL。但是,当我们把鼠标移到某个子窗口的时候,并转动滚轮,应该是希望这个子窗口响应滚轮,而不管它是否有焦点。最直接的解决方法是调用SetFoucs函数把这个子窗口设为有焦点。

常规来说,滚轮是改变滚动条位置的,而单击鼠标左键才是用来改变焦点的。滚动滚轮的时候焦点改变并不是我们所希望的。

那我们要怎么又使鼠标下面的窗口响应滚轮, 而又不改变焦点呢? 这就需要重载 PreTranslateMessage 来改变响应WM_MOUSEWHEEL消息的窗口。


下面是例程:

BOOL CXXXApp::PreTranslateMessage(MSG* pMsg)
{
 if (pMsg->message == WM_MOUSEHWHEEL || pMsg->message == WM_MOUSEWHEEL)
 {
  POINT pos; 
  GetCursorPos (&pos); 
  pMsg->hwnd = WindowFromPoint (pos); 
 }

 return CWinAppEx::PreTranslateMessage(pMsg);
}


对于没用MFC的程序来说,可以参考下面的代码

int WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    MSG msg; 
    while (GetMessage (&msg, NULL, 0, 0)) 
    { 
        if (msg.message == WM_MOUSEWHEEL) 
        { 
            POINT pos; 
            GetCursorPos (&pos); 
            msg.hwnd = WindowFromPoint (pos);       //要在TranslateMessage 函数前面
        }
        TranslateMessage (&msg); 
        DispatchMessage (&msg); 
    }
}


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP