bool CWndScroller::_OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { if (mp_origWnd == NULL) return true; //if vertical scrollbar is not enabled than nothing to do int scrlMin = 0, scrlMax = 0; mp_origWnd->GetScrollRange(SB_VERT, &scrlMin, &scrlMax); if (scrlMin == scrlMax) return true; int scrlLnPerInc = 0, scrlIncNum = (abs(zDelta) / WHEEL_DELTA); ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &scrlLnPerInc, 0); //check if page scroll has requested. if (scrlLnPerInc == WHEEL_PAGESCROLL) { _OnVScroll(zDelta <= 0 ? SB_PAGEDOWN : SB_PAGEUP, 0, NULL); return true; } int numScrlLines = std::max((scrlIncNum * scrlLnPerInc) / 3, 1); for(int i = 0; i < numScrlLines; ++i) _OnVScroll(zDelta <= 0 ? SB_LINEDOWN : SB_LINEUP, 0, NULL); return true; }
LRESULT CWndScroller::WndProcSub(UINT uMsg, WPARAM wParam, LPARAM lParam) { if (lParam) //Do nothing if it is not standard scroll bar return CWindowSubClasser::WndProcSub(uMsg, wParam, lParam); switch(uMsg) { case WM_HSCROLL: _OnHScroll(LOWORD(wParam), HIWORD(wParam), reinterpret_cast<HWND>(lParam)); break; case WM_VSCROLL: _OnVScroll(LOWORD(wParam), HIWORD(wParam), reinterpret_cast<HWND>(lParam)); break; case WM_MOUSEWHEEL: _OnMouseWheel(LOWORD(wParam), HIWORD(wParam), CPoint(LOWORD(lParam), HIWORD(lParam))); break; case WM_SIZE: _UpdateScrollInfo(); break; default: return CWindowSubClasser::WndProcSub(uMsg, wParam, lParam); } return 0; }
LRESULT CALLBACK CCandidateWindow::_WindowProcCallback(_In_ HWND wndHandle, UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam) { switch (uMsg) { case WM_CREATE: { HDC dcHandle = nullptr; dcHandle = GetDC(wndHandle); if (dcHandle) { HFONT hFontOld = (HFONT)SelectObject(dcHandle, Global::defaultlFontHandle); GetTextMetrics(dcHandle, &_TextMetric); _cxTitle = _TextMetric.tmMaxCharWidth * _wndWidth; SelectObject(dcHandle, hFontOld); ReleaseDC(wndHandle, dcHandle); } } return 0; case WM_DESTROY: _DeleteShadowWnd(); return 0; case WM_WINDOWPOSCHANGED: { WINDOWPOS* pWndPos = (WINDOWPOS*)lParam; // move shadow if (_pShadowWnd) { _pShadowWnd->_OnOwnerWndMoved((pWndPos->flags & SWP_NOSIZE) == 0); } // move v-scroll if (_pVScrollBarWnd) { _pVScrollBarWnd->_OnOwnerWndMoved((pWndPos->flags & SWP_NOSIZE) == 0); } _FireMessageToLightDismiss(wndHandle, pWndPos); } break; case WM_WINDOWPOSCHANGING: { WINDOWPOS* pWndPos = (WINDOWPOS*)lParam; // show/hide shadow if (_pShadowWnd) { if ((pWndPos->flags & SWP_HIDEWINDOW) != 0) { _pShadowWnd->_Show(FALSE); } // don't go behaind of shadow if (((pWndPos->flags & SWP_NOZORDER) == 0) && (pWndPos->hwndInsertAfter == _pShadowWnd->_GetWnd())) { pWndPos->flags |= SWP_NOZORDER; } _pShadowWnd->_OnOwnerWndMoved((pWndPos->flags & SWP_NOSIZE) == 0); } // show/hide v-scroll if (_pVScrollBarWnd) { if ((pWndPos->flags & SWP_HIDEWINDOW) != 0) { _pVScrollBarWnd->_Show(FALSE); } _pVScrollBarWnd->_OnOwnerWndMoved((pWndPos->flags & SWP_NOSIZE) == 0); } } break; case WM_SHOWWINDOW: // show/hide shadow if (_pShadowWnd) { _pShadowWnd->_Show((BOOL)wParam); } // show/hide v-scroll if (_pVScrollBarWnd) { _pVScrollBarWnd->_Show((BOOL)wParam); } break; case WM_PAINT: { HDC dcHandle = nullptr; PAINTSTRUCT ps; dcHandle = BeginPaint(wndHandle, &ps); _OnPaint(dcHandle, &ps); _DrawBorder(wndHandle, CANDWND_BORDER_WIDTH*2); EndPaint(wndHandle, &ps); } return 0; case WM_SETCURSOR: { POINT cursorPoint; GetCursorPos(&cursorPoint); MapWindowPoints(NULL, wndHandle, &cursorPoint, 1); // handle mouse message _HandleMouseMsg(HIWORD(lParam), cursorPoint); } return 1; case WM_MOUSEMOVE: case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_RBUTTONUP: { POINT point; POINTSTOPOINT(point, MAKEPOINTS(lParam)); // handle mouse message _HandleMouseMsg(uMsg, point); } // we processes this message, it should return zero. return 0; case WM_MOUSEACTIVATE: { WORD mouseEvent = HIWORD(lParam); if (mouseEvent == WM_LBUTTONDOWN || mouseEvent == WM_RBUTTONDOWN || mouseEvent == WM_MBUTTONDOWN) { return MA_NOACTIVATE; } } break; case WM_POINTERACTIVATE: return PA_NOACTIVATE; case WM_VSCROLL: _OnVScroll(LOWORD(wParam), HIWORD(wParam)); return 0; } return DefWindowProc(wndHandle, uMsg, wParam, lParam); }