template <class BASE> void CDialogMinTrayBtn<BASE>::MinTrayBtnUpdatePosAndSize() { bool bNrmWnd = (GetExStyle() & WS_EX_TOOLWINDOW) == 0; int iXSz; if (IsWindowsClassicStyle()) iXSz = GetSystemMetrics(bNrmWnd ? SM_CXSIZE : SM_CXSMSIZE) - 2; else // SM_SX*SIZE seems wrong when theming is on, as buttons are squares, we use Y size. iXSz = GetSystemMetrics(bNrmWnd ? SM_CYSIZE : SM_CYSMSIZE) - 4; m_MinTrayBtnSize = CSize(iXSz, GetSystemMetrics(bNrmWnd ? SM_CYSIZE : SM_CYSMSIZE) - 4); DWORD dwStyle = GetStyle(); bool bSzFrm = (dwStyle & WS_THICKFRAME) != 0; CRect rcWnd; GetWindowRect(&rcWnd); iXSz += CAPTION_BUTTONSPACE; m_MinTrayBtnPos = CSize( rcWnd.Width() - ((iXSz + CAPTION_BUTTONSPACE) << 1) + GetSystemMetrics(bSzFrm ? SM_CXSIZEFRAME : SM_CXFIXEDFRAME), CAPTION_BUTTONSPACE + GetSystemMetrics(bSzFrm ? SM_CYSIZEFRAME : SM_CYFIXEDFRAME) ); // If it isn't a toolbox and minimize/maximize buttons are present, include their size if (bNrmWnd && (dwStyle & (WS_MINIMIZEBOX | WS_MAXIMIZEBOX)) != 0) m_MinTrayBtnPos.x -= IsWindowsClassicStyle() ? ((iXSz << 1) + CAPTION_BUTTONSPACE) : ((iXSz + CAPTION_BUTTONSPACE) << 1); }
TEMPLATE void CDialogMinTrayBtn<BASE>::MinTrayBtnUpdatePosAndSize() { DWORD dwStyle = GetStyle(); DWORD dwExStyle = GetExStyle(); INT cyCaption = ((dwExStyle & WS_EX_TOOLWINDOW) == 0) ? GetSystemMetrics(SM_CYCAPTION) - 1 : GetSystemMetrics(SM_CYSMCAPTION) - 1; if (cyCaption < CAPTION_MINHEIGHT) cyCaption = CAPTION_MINHEIGHT; CSize borderfixed(-GetSystemMetrics(SM_CXFIXEDFRAME), GetSystemMetrics(SM_CYFIXEDFRAME)); CSize bordersize(-GetSystemMetrics(SM_CXSIZEFRAME), GetSystemMetrics(SM_CYSIZEFRAME)); CRect rcWnd; GetWindowRect(&rcWnd); // get Windows' frame window button width/height (this may not always be a square!) CSize szBtn; szBtn.cy = cyCaption - (CAPTION_BUTTONSPACE * 2); if (IsWindowsClassicStyle()) szBtn.cx = GetSystemMetrics(SM_CXSIZE) - 2; else szBtn.cx = GetSystemMetrics(SM_CXSIZE) - 4; // set our frame window button width/height... if (IsWindowsClassicStyle()){ // ...this is same as Windows' buttons for non WinXP m_MinTrayBtnSize = szBtn; } else{ // ...this is a square for WinXP m_MinTrayBtnSize.cx = szBtn.cy; m_MinTrayBtnSize.cy = szBtn.cy; } m_MinTrayBtnPos.x = rcWnd.Width() - (CAPTION_BUTTONSPACE + m_MinTrayBtnSize.cx + CAPTION_BUTTONSPACE + szBtn.cx); m_MinTrayBtnPos.y = CAPTION_BUTTONSPACE; if ((dwStyle & WS_THICKFRAME) != 0) { // resizable window m_MinTrayBtnPos += bordersize; } else { // fixed window m_MinTrayBtnPos += borderfixed; } if ( ((dwExStyle & WS_EX_TOOLWINDOW) == 0) && (((dwStyle & WS_MINIMIZEBOX) != 0) || ((dwStyle & WS_MAXIMIZEBOX) != 0)) ) { if (IsWindowsClassicStyle()) m_MinTrayBtnPos.x -= (szBtn.cx * 2) + CAPTION_BUTTONSPACE; else m_MinTrayBtnPos.x -= (szBtn.cx + CAPTION_BUTTONSPACE) * 2; } }
TEMPLATE UINT CDialogMinTrayBtn<BASE>::OnNcHitTest(CPoint point) { BOOL bPreviousHitTest = m_bMinTrayBtnHitTest; m_bMinTrayBtnHitTest = MinTrayBtnHitTest(point); if (!IsWindowsClassicStyle() && m_bMinTrayBtnHitTest != bPreviousHitTest) MinTrayBtnDraw(); // Windows XP Style (hot button) if (m_bMinTrayBtnHitTest) return HTMINTRAYBUTTON; return BASE::OnNcHitTest(point); }
TEMPLATE void CDialogMinTrayBtn<BASE>::OnTimer(UINT_PTR nIDEvent) { if (!IsWindowsClassicStyle() && nIDEvent == m_nMinTrayBtnTimerId) { // Visual XP Style (hot button) CPoint point; GetCursorPos(&point); BOOL bHitTest = MinTrayBtnHitTest(point); if (m_bMinTrayBtnHitTest != bHitTest) { m_bMinTrayBtnHitTest = bHitTest; MinTrayBtnDraw(); } } }