Bootstrap

WM_MOUSEWHEEL与WM_MOUSEHWHEEL

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

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

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

 

 

 

例子: 

  1. BOOL CXXXApp::PreTranslateMessage(MSG* pMsg)

  2. {

  3. if (pMsg->message == WM_MOUSEHWHEEL || pMsg->message == WM_MOUSEWHEEL)

  4. {

  5. POINT pos;

  6. GetCursorPos (&pos);

  7. pMsg->hwnd = WindowFromPoint (pos);

  8. }

  9.  
  10. return CWinAppEx::PreTranslateMessage(pMsg);

  11. }

  12.  


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

  1. int WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

  2. {

  3. MSG msg;

  4. while (GetMessage (&msg, NULL, 0, 0))

  5. {

  6. if (msg.message == WM_MOUSEWHEEL)

  7. {

  8. POINT pos;

  9. GetCursorPos (&pos);

  10. msg.hwnd = WindowFromPoint (pos); //要在TranslateMessage 函数前面

  11. }

  12. TranslateMessage (&msg);

  13. DispatchMessage (&msg);

  14. }

  15. }

 

详情参考:

https://blog.csdn.net/mazhen2006/article/details/7050449

;