轉載自:http://blog.csdn.net/mazhen2006/article/details/7050449
轉動滾輪會導致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);
}
}