在DuiLib中, 无法在HandleMessage中截获到 WM_MOUSEWHEEL.
在DuiLib中看到, WM_MOUSEWHEEL处理已经是虚函数了.
当对话框 从 WindowImplBase 继承来时, 可以直接重载虚函数 OnMouseWheel
virtual LRESULT OnMouseWheel(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
LRESULT xxDlg::OnMouseWheel(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
bHandled = FALSE;
return 0;
}
处理了这个虚函数,在窗体内,任意位置滚动鼠标滚轮, 都可以直接模拟滑动条消息的处理.
LRESULT CxxDlg::OnMouseWheel(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
std::wstring strMsg = L"";
WORD fwKeys = GET_KEYSTATE_WPARAM(wParam);
WORD zDelta = GET_WHEEL_DELTA_WPARAM(wParam);
WORD xPos = GET_X_LPARAM(lParam);
WORD yPos = GET_Y_LPARAM(lParam);
strMsg = ns_base::StringFormatV(L"fwKeys = 0x%X, zDelta = 0x%X, xPos = 0x%X, yPos = 0x%X\r\n",
fwKeys,
zDelta,
xPos,
yPos);
OutputDebugStringW(strMsg.c_str());
WriteLog(L"OnMouseWheel : %s", strMsg.c_str());
bHandled = FALSE;
return 0;
}
/// 在同一位置向下滚轮
OnMouseWheel : fwKeys = 0x0, zDelta = 0xFF88, xPos = 0x46B, yPos = 0x15E
OnMouseWheel : fwKeys = 0x0, zDelta = 0xFF88, xPos = 0x46B, yPos = 0x15E
OnMouseWheel : fwKeys = 0x0, zDelta = 0xFF88, xPos = 0x46B, yPos = 0x15E
/// 在同一位置向上滚轮
OnMouseWheel : fwKeys = 0x0, zDelta = 0x78, xPos = 0x46B, yPos = 0x15E
OnMouseWheel : fwKeys = 0x0, zDelta = 0x78, xPos = 0x46B, yPos = 0x15E
OnMouseWheel : fwKeys = 0x0, zDelta = 0x78, xPos = 0x46B, yPos = 0x15E
OnMouseWheel : fwKeys = 0x0, zDelta = 0x78, xPos = 0x46B, yPos = 0x15E
/// 可以看出 zDelta的高字节,代表滚轮方向
LRESULT CxxDlg::OnMouseWheel(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
int iValueNew = 0;
int iValueRange = (m_pProgress->GetMaxValue() - m_pProgress->GetMinValue());
int iValueRc = m_pProgress->GetValue();
WORD fwKeys = GET_KEYSTATE_WPARAM(wParam);
WORD zDelta = GET_WHEEL_DELTA_WPARAM(wParam);
WORD xPos = GET_X_LPARAM(lParam);
WORD yPos = GET_Y_LPARAM(lParam);
if ((zDelta & 0xff00) > 0)
iValueNew = ((iValueRc + 1) > m_pProgress->GetMaxValue()) ? iValueRc : (iValueRc + 1);
else
iValueNew = ((iValueRc - 1) < m_pProgress->GetMinValue()) ? iValueRc : (iValueRc - 1);
m_pProgress->SetValue(iValueNew);
m_PaintManager.SendNotify(m_pProgress, DUI_MSGTYPE_VALUECHANGED);
bHandled = TRUE;
return 0;
}
void CxxDlg::Notify(TNotifyUI & msg)
{
if (msg.pSender == m_pProgress)
{
if (msg.sType == DUI_MSGTYPE_VALUECHANGED)
{
SliderPosChange();
/// do task when Slider bar position was changed
}
}
return __super::Notify(msg);
}