轉(zhuǎn)載自:http://blog.csdn.net/mazhen2006/article/details/7050449
轉(zhuǎn)動(dòng)滾輪會(huì)導(dǎo)致Windows在有輸入焦點(diǎn)的窗口(不是鼠標(biāo)光標(biāo)下面的窗口)產(chǎn)生WM_MOUSEWHEEL消息。所以當(dāng)子窗口沒(méi)有焦點(diǎn)的時(shí)候?qū)⑹詹坏较M_MOUSEWHEEL。但是,當(dāng)我們把鼠標(biāo)移到某個(gè)子窗口的時(shí)候,并轉(zhuǎn)動(dòng)滾輪,應(yīng)該是希望這個(gè)子窗口響應(yīng)滾輪,而不管它是否有焦點(diǎn)。最直接的解決方法是調(diào)用SetFoucs函數(shù)把這個(gè)子窗口設(shè)為有焦點(diǎn)。
常規(guī)來(lái)說(shuō),滾輪是改變滾動(dòng)條位置的,而單擊鼠標(biāo)左鍵才是用來(lái)改變焦點(diǎn)的。滾動(dòng)滾輪的時(shí)候焦點(diǎn)改變并不是我們所希望的。
那我們要怎么又使鼠標(biāo)下面的窗口響應(yīng)滾輪, 而又不改變焦點(diǎn)呢? 這就需要重載 PreTranslateMessage 來(lái)改變響應(yīng)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);
}
對(duì)于沒(méi)用MFC的程序來(lái)說(shuō),可以參考下面的代碼
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 函數(shù)前面
}
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}