BOOL CXTPDockingPaneTabbedContainer::CanAttach(CRect& rcClient, CPoint pt) const { CRect rcTitle(rcClient); BOOL bVertical = IsCaptionVertical(); if (m_bTitleVisible) { if (bVertical) { rcClient.left += CXTPDockingPaneBase::GetPaintManager()->GetCaptionHeight() + 3; } else { rcClient.top += CXTPDockingPaneBase::GetPaintManager()->GetCaptionHeight() + 3; } } else { SAFE_CALLPTR(m_pDockingSite, GetWindowRect(rcTitle)); } if (bVertical) { rcTitle.right = rcClient.left; } else { rcTitle.bottom = rcClient.top; } if (rcTitle.PtInRect(pt)) return TRUE; if (IsTabsVisible()) { CRect rcTabs(rcClient); rcClient.bottom -= CXTPDockingPaneBase::GetPaintManager()->GetTabsHeight(); rcTabs.top = rcClient.bottom; if (rcTabs.PtInRect(pt)) return TRUE; } return FALSE; }
void CNavPaneWnd::OnPaint() { CPaintDC dc(this); // device context for painting CRect rcClient = ::GetClientRect(this); COLORREF clrBtnface = ::GetSysColor(COLOR_BTNFACE); COLORREF clrTabBg = ChangeBrightness(clrBtnface, 0.85); COLORREF clrHilight = ::GetSysColor(COLOR_BTNHILIGHT); COLORREF clrShadow = ::GetSysColor(COLOR_BTNSHADOW); COLORREF clrFrame = ::GetSysColor(COLOR_WINDOWFRAME); if (m_tabs.empty()) { dc.FillSolidRect(rcClient, clrBtnface); return; } // Draw tabs offscreen CSize szTabs(s_nTabsWidth + 1, rcClient.Height()); m_offscreenDC.Create(&dc, szTabs); CDC* pDC = &m_offscreenDC; CRect rcTabs(rcClient); rcTabs.right = rcTabs.left + s_nTabsWidth; pDC->FillSolidRect(rcTabs, clrTabBg); // Vertical line CRect rcLine(rcTabs.right, rcClient.top, rcTabs.right + 1, rcClient.bottom); pDC->FillSolidRect(rcLine, clrShadow); for (int nDiff = (int)m_tabs.size(); nDiff > 0; --nDiff) { if (m_nActiveTab - nDiff >= 0) DrawTab(pDC, m_nActiveTab - nDiff, false); if (m_nActiveTab + nDiff < static_cast<int>(m_tabs.size())) DrawTab(pDC, m_nActiveTab + nDiff, false); } DrawTab(pDC, m_nActiveTab, true); // Flush bitmap to screen dc dc.BitBlt(0, 0, szTabs.cx, szTabs.cy, pDC, 0, 0, SRCCOPY); m_offscreenDC.Release(); // Left space rcTabs.left = rcTabs.right + 1; rcTabs.right = rcTabs.left + s_nLeftMargin; dc.FillSolidRect(rcTabs, clrBtnface); if (m_tabs[m_nActiveTab].bHasBorder) { rcLine.OffsetRect(s_nLeftMargin + 1, 0); rcLine.top += s_nTopMargin; dc.FillSolidRect(rcLine, clrShadow); } // Top space rcTabs.right = rcClient.right; rcTabs.bottom = rcTabs.top + s_nTopMargin; dc.FillSolidRect(rcTabs, clrBtnface); if (m_tabs[m_nActiveTab].bHasBorder) { rcLine.right = rcClient.right; rcLine.bottom = rcLine.top + 1; dc.FillSolidRect(rcLine, clrShadow); } if (rcClient.Width() > 70) { // Close button if (m_hTheme != NULL) { if (m_bClosePressed) XPDrawThemeBackground(m_hTheme, dc.m_hDC, TP_BUTTON, TS_PRESSED, m_rcClose, NULL); else if (m_bCloseActive) XPDrawThemeBackground(m_hTheme, dc.m_hDC, TP_BUTTON, TS_HOT, m_rcClose, NULL); } else { if (m_bClosePressed) dc.Draw3dRect(m_rcClose, clrShadow, clrHilight); else if (m_bCloseActive) dc.Draw3dRect(m_rcClose, clrHilight, clrShadow); } CPoint ptOffset(m_rcClose.left + (m_rcClose.Width() - 10) / 2, m_rcClose.top + (m_rcClose.Height() - 10) / 2); if (m_bClosePressed) ptOffset.Offset(1, m_hTheme != NULL ? 0 : 1); m_imgClose.Draw(&dc, 0, ptOffset, ILD_NORMAL); // Settings button if (m_nActiveTab != -1 && m_tabs[m_nActiveTab].bHasSettings) { if (m_hTheme != NULL) { if (m_bSettingsPressed) XPDrawThemeBackground(m_hTheme, dc.m_hDC, TP_BUTTON, TS_PRESSED, m_rcSettings, NULL); else if (m_bSettingsActive) XPDrawThemeBackground(m_hTheme, dc.m_hDC, TP_BUTTON, TS_HOT, m_rcSettings, NULL); } else { if (m_bSettingsPressed) dc.Draw3dRect(m_rcSettings, clrShadow, clrHilight); else if (m_bSettingsActive) dc.Draw3dRect(m_rcSettings, clrHilight, clrShadow); } CPoint ptOffset2(m_rcSettings.left + (m_rcSettings.Width() - 10) / 2, m_rcSettings.top + (m_rcSettings.Height() - 10) / 2); if (m_bSettingsPressed) ptOffset2.Offset(1, m_hTheme != NULL ? 0 : 1); m_imgSettings.Draw(&dc, 0, ptOffset2, ILD_NORMAL); } } }