void CXTPSkinObjectFrame::HandleTimer(UINT_PTR uTimerID) { if (uTimerID == XTP_TID_REFRESHFRAME) { RefreshFrameStyle(); KillTimer(XTP_TID_REFRESHFRAME); return; } if (uTimerID == XTP_TID_MOUSELEAVE) { RECT rect; POINT pt; GetWindowRect(&rect); ::GetCursorPos (&pt); if (::GetCapture() != NULL) return; LRESULT lHitTest = HandleNcHitTest(MAKELPARAM(pt.x, pt.y)); if ((lHitTest == HTCLIENT || lHitTest == HTNOWHERE || lHitTest == HTBOTTOMRIGHT || lHitTest == HTBOTTOMLEFT) || !::PtInRect (&rect, pt)) { HandleMouseMove(CPoint(-1, -1)); CancelMouseLeaveTracking(); } return; } }
// Helper to dispatch messages to the Desktop Window Manager for processing LRESULT cef_dark_aero_window::DwpCustomFrameProc(UINT message, WPARAM wParam, LPARAM lParam, bool* pfCallDefWindowProc) { LRESULT lr = 0L; *pfCallDefWindowProc = CDwmDLL::DwmDefWindowProc(mWnd, message, wParam, lParam, &lr) == 0; switch (message) { case WM_CREATE: if (HandleCreate()) { *pfCallDefWindowProc = true; lr = 0L; } break; case WM_ACTIVATE: if (HandleActivate()) { *pfCallDefWindowProc = true; lr = 0L; } break; case WM_PAINT: if (HandlePaint()) { *pfCallDefWindowProc = true; lr = 0L; } break; case WM_NCCALCSIZE: if (HandleNcCalcSize((BOOL)(wParam != 0), reinterpret_cast<NCCALCSIZE_PARAMS*>(lParam), &lr)) { *pfCallDefWindowProc = false; } break; case WM_NCHITTEST: if (lr == 0) { // Handle hit testing in the NCA if not handled by DwmDefWindowProc. POINT pt; POINTSTOPOINT(pt, lParam); lr = HandleNcHitTest(&pt); if (lr != HTNOWHERE) { *pfCallDefWindowProc = false; } } break; } return lr; }
LRESULT CXTPSkinObjectFrame::OnNcHitTest(CPoint point) { LRESULT nHitCode = (LRESULT)CXTPSkinObject::OnNcHitTest(point); LRESULT nHitCode2 = HandleNcHitTest(point); if (nHitCode2 != HTNOWHERE) return nHitCode2; if (nHitCode == HTCLOSE || nHitCode == HTMAXBUTTON || nHitCode == HTMINBUTTON || nHitCode == HTHELP || nHitCode == HTMENU) return (LRESULT)HTCAPTION; if ((nHitCode == HTVSCROLL || nHitCode == HTHSCROLL) && !IsFlatScrollBarInitialized()) return (LRESULT)HTCLIENT; return nHitCode; }
// WindowProc handles dispatching of messages and routing back to the base class or to Windows LRESULT cef_dark_window::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_SETTINGCHANGE: // NOTE: We want anyone else interested in this message // to be notified of a setting change even if we handle // the message. Otherwise the default implementation // may be in the wrong state HandleSettingChange((UINT)wParam, (LPCWSTR)lParam); break; case WM_NCMOUSELEAVE: // NOTE: We want anyone else interested in this message // to be notified. Otherwise the default implementation // may be in the wrong state HandleNcMouseLeave(); break; case WM_NCMOUSEMOVE: if (HandleNcMouseMove((UINT)wParam)) return 0L; break; case WM_NCLBUTTONDOWN: if (HandleNcLeftButtonDown((UINT)wParam)) return 0L; break; case WM_NCLBUTTONUP: { POINT pt; POINTSTOPOINT(pt, lParam); if (HandleNcLeftButtonUp((UINT)wParam, &pt)) return 0L; } break; case WM_NCCREATE: if (HandleNcCreate()) return 0L; break; case WM_NCPAINT: if (HandleNcPaint((HRGN)wParam)) return 0L; break; case WM_NCDESTROY: if (HandleNcDestroy()) return 0L; break; case WM_NCHITTEST: { POINT pt; POINTSTOPOINT(pt, lParam); return HandleNcHitTest(&pt); } break; case WM_MEASUREITEM: if (HandleMeasureItem((LPMEASUREITEMSTRUCT)lParam)) return TRUE; break; case WM_DRAWITEM: if (HandleDrawItem((LPDRAWITEMSTRUCT)lParam)) return TRUE; break; case WM_SETICON: mWindowIcon = 0; break; case WM_SETTEXT: case WM_ACTIVATE: case WM_NCACTIVATE: // Turn off redraw because the // DefaultWindowProc will paint over top of // our frame and cause the title bar to flicker if (!IsIconic()){ SetRedraw(FALSE); } break; } LRESULT lr = cef_window::WindowProc(message, wParam, lParam); // post default message processing switch (message) { case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: case WM_MOVE: case WM_SIZE: case WM_SIZING: case WM_EXITSIZEMOVE: UpdateNonClientArea(); break; } // special case -- since we turned off redraw for these // messages to reduce flicker, we need to turn redraw // on now and force updating the non-client area switch (message) { case WM_SETTEXT: case WM_ACTIVATE: case WM_NCACTIVATE: if (!IsIconic()){ SetRedraw(TRUE); UpdateNonClientArea(); if (message != WM_SETTEXT) { DoRepaintClientArea(); } } break; } return lr; }