下面的信息来自http://support.microsoft.com/kb/237998
对话框上旋转鼠标滚轮时, 不会处理程序中 WM_MOUSEWHEEL 中的邮件对话框类不调用运行 Windows 95 的计算机上。
在 MFC 中的 CDialog 类没有注册 MSH_MOUSEWHEEL 邮件需要才能接收 WM_MOUSEWHEEL 运行 Windows 95 的计算机上的邮件。
按照下面介绍的步骤可以解决此问题:
注册 MSH_MOUSEWHEEL 邮件。 将下面的行复制到您 dialog.cpp 文件:
AFX_STATIC UINT _afxMsgMouseWheel =
(((::GetVersion() & 0x80000000) && LOBYTE(LOWORD(::GetVersion()) == 4)) ||
(!(::GetVersion() & 0x80000000) && LOBYTE(LOWORD(::GetVersion()) == 3)))
? ::RegisterWindowMessage(MSH_MOUSEWHEEL) : 0;
将该行添加到对话框类的消息映射中, AFX_MSG_MAP 节之后:
ON_REGISTERED_MESSAGE(_afxMsgMouseWheel, OnRegisteredMouseWheel)
添加名为 OnRegisteredMouseWheel 传递一个 WPARAM 和 LPARAM,并返回到对话框类的 LRESULT 一个成员函数。 在函数定义 (代码取自 Winfrm.cpp) 中添加以下代码:
LRESULT CMyDialog::OnRegisteredMouseWheel(WPARAM wParam, LPARAM lParam)
{
// Convert from MSH_MOUSEWHEEL to WM_MOUSEWHEEL.
WORD keyState = 0;
keyState |= (::GetKeyState(VK_CONTROL) < 0) ? MK_CONTROL : 0;
keyState |= (::GetKeyState(VK_SHIFT) < 0) ? MK_SHIFT : 0;
LRESULT lResult;
HWND hwFocus = ::GetFocus();
const HWND hwDesktop = ::GetDesktopWindow();
if (hwFocus == NULL)
lResult = SendMessage(WM_MOUSEWHEEL, (wParam << 16) | keyState, lParam);
else
{
do {
lResult = ::SendMessage(hwFocus, WM_MOUSEWHEEL,
(wParam << 16) | keyState, lParam);
hwFocus = ::GetParent(hwFocus);
}
while (lResult == 0 && hwFocus != NULL && hwFocus != hwDesktop);
}
return lResult;
}
现在应用程序的对话框类应能够收到 WM_MOUSEWHEEL 信息。