📄 cooldialogbar.cpp
字号:
dwBorderStyle &= ~CBRS_BORDER_LEFT;
lpncsp->rgrc[0].left += m_cxEdge;
lpncsp->rgrc[0].right += -m_cxBorder;
lpncsp->rgrc[0].bottom += -m_cxBorder;
lpncsp->rgrc[0].top += m_cxGripper;
m_rectBorder.right = m_rectBorder.left + m_cxEdge;
break;
default:
m_rectBorder.SetRectEmpty();
break;
}
SetBarStyle(dwBorderStyle);
}
void CCoolDialogBar::OnNcPaint()
{
EraseNonClient();
CWindowDC dc(this);
dc.Draw3dRect(m_rectBorder, GetSysColor(COLOR_BTNHIGHLIGHT),
GetSysColor(COLOR_BTNSHADOW));
DrawGripper(dc);
CRect pRect;
GetClientRect( &pRect );
InvalidateRect( &pRect, TRUE );
}
void CCoolDialogBar::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
if (m_bTracking) return;
if((nHitTest == HTSYSMENU) && !IsFloating())
{
ShowWindow(SW_HIDE);
m_pDockContext->ToggleDocking();
}
else if ((nHitTest == HTMINBUTTON) && !IsFloating())
m_pDockContext->ToggleDocking();
else if ((nHitTest == HTCAPTION) && !IsFloating() && (m_pDockBar != NULL))
{
// start the drag
ASSERT(m_pDockContext != NULL);
m_pDockContext->StartDrag(point);
}
else if ((nHitTest == HTSIZE) && !IsFloating())
StartTracking();
else
CControlBar::OnNcLButtonDown(nHitTest, point);
}
UINT CCoolDialogBar::OnNcHitTest(CPoint point)
{
if (IsFloating())
return CControlBar::OnNcHitTest(point);
CRect rc;
GetWindowRect(rc);
point.Offset(-rc.left, -rc.top);
if(m_rectClose.PtInRect(point))
return HTSYSMENU;
else if (m_rectUndock.PtInRect(point))
return HTMINBUTTON;
else if (m_rectGripper.PtInRect(point))
return HTCAPTION;
else if (m_rectBorder.PtInRect(point))
return HTSIZE;
else
return CControlBar::OnNcHitTest(point);
}
void CCoolDialogBar::OnLButtonDown(UINT nFlags, CPoint point)
{
// only start dragging if clicked in "void" space
if (m_pDockBar != NULL)
{
// start the drag
ASSERT(m_pDockContext != NULL);
ClientToScreen(&point);
m_pDockContext->StartDrag(point);
}
else
{
CWnd::OnLButtonDown(nFlags, point);
}
}
void CCoolDialogBar::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// only toggle docking if clicked in "void" space
if (m_pDockBar != NULL)
{
// toggle docking
ASSERT(m_pDockContext != NULL);
m_pDockContext->ToggleDocking();
}
else
{
CWnd::OnLButtonDblClk(nFlags, point);
}
}
void CCoolDialogBar::StartTracking()
{
SetCapture();
// make sure no updates are pending
RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_UPDATENOW);
m_pDockSite->LockWindowUpdate();
m_ptOld = m_rectBorder.CenterPoint();
m_bTracking = TRUE;
m_rectTracker = m_rectBorder;
if (!IsHorz()) m_rectTracker.bottom -= 4;
OnInvertTracker(m_rectTracker);
}
void CCoolDialogBar::OnCaptureChanged(CWnd *pWnd)
{
if (m_bTracking && pWnd != this)
StopTracking(FALSE); // cancel tracking
CControlBar::OnCaptureChanged(pWnd);
}
void CCoolDialogBar::StopTracking(BOOL bAccept)
{
OnInvertTracker(m_rectTracker);
m_pDockSite->UnlockWindowUpdate();
m_bTracking = FALSE;
ReleaseCapture();
if (!bAccept) return;
int maxsize, minsize, newsize;
CRect rcc;
m_pDockSite->GetWindowRect(rcc);
newsize = IsHorz() ? m_sizeHorz.cy : m_sizeVert.cx;
maxsize = newsize + (IsHorz() ? rcc.Height() : rcc.Width());
minsize = IsHorz() ? m_sizeMin.cy : m_sizeMin.cx;
CPoint point = m_rectTracker.CenterPoint();
switch (m_nDockBarID)
{
case AFX_IDW_DOCKBAR_TOP:
newsize += point.y - m_ptOld.y; break;
case AFX_IDW_DOCKBAR_BOTTOM:
newsize += -point.y + m_ptOld.y; break;
case AFX_IDW_DOCKBAR_LEFT:
newsize += point.x - m_ptOld.x; break;
case AFX_IDW_DOCKBAR_RIGHT:
newsize += -point.x + m_ptOld.x; break;
}
newsize = max(minsize, min(maxsize, newsize));
if (IsHorz())
m_sizeHorz.cy = newsize;
else
m_sizeVert.cx = newsize;
m_pDockSite->RecalcLayout();
}
void CCoolDialogBar::OnInvertTracker(const CRect& rect)
{
ASSERT_VALID(this);
ASSERT(!rect.IsRectEmpty());
ASSERT(m_bTracking);
CRect rct = rect, rcc, rcf;
GetWindowRect(rcc);
m_pDockSite->GetWindowRect(rcf);
rct.OffsetRect(rcc.left - rcf.left, rcc.top - rcf.top);
rct.DeflateRect(1, 1);
CDC *pDC = m_pDockSite->GetDCEx(NULL,
DCX_WINDOW|DCX_CACHE|DCX_LOCKWINDOWUPDATE);
CBrush* pBrush = CDC::GetHalftoneBrush();
HBRUSH hOldBrush = NULL;
if (pBrush != NULL)
hOldBrush = (HBRUSH)SelectObject(pDC->m_hDC, pBrush->m_hObject);
pDC->PatBlt(rct.left, rct.top, rct.Width(), rct.Height(), PATINVERT);
if (hOldBrush != NULL)
SelectObject(pDC->m_hDC, hOldBrush);
m_pDockSite->ReleaseDC(pDC);
}
BOOL CCoolDialogBar::IsHorz() const
{
return (m_nDockBarID == AFX_IDW_DOCKBAR_TOP ||
m_nDockBarID == AFX_IDW_DOCKBAR_BOTTOM);
}
CPoint& CCoolDialogBar::ClientToWnd(CPoint& point)
{
if (m_nDockBarID == AFX_IDW_DOCKBAR_BOTTOM)
point.y += m_cxEdge;
else if (m_nDockBarID == AFX_IDW_DOCKBAR_RIGHT)
point.x += m_cxEdge;
return point;
}
void CCoolDialogBar::DrawGripper(CDC & dc)
{
// no gripper if floating
if( m_dwStyle & CBRS_FLOATING )
return;
// -==HACK==-
// in order to calculate the client area properly after docking,
// the client area must be recalculated twice (I have no idea why)
m_pDockSite->RecalcLayout();
// -==END HACK==-
CRect gripper;
GetWindowRect( gripper );
ScreenToClient( gripper );
gripper.OffsetRect( -gripper.left, -gripper.top );
if( m_dwStyle & CBRS_ORIENT_HORZ ) {
// gripper at left
m_rectGripper.top = gripper.top + 40;
m_rectGripper.bottom = gripper.bottom;
m_rectGripper.left = gripper.left;
m_rectGripper.right = gripper.left + 20;
// draw close box
m_rectClose.left = gripper.left + 7;
m_rectClose.right = m_rectClose.left + 12;
m_rectClose.top = gripper.top + 10;
m_rectClose.bottom = m_rectClose.top + 12;
dc.DrawFrameControl(m_rectClose, DFC_CAPTION, DFCS_CAPTIONCLOSE);
// draw docking toggle box
m_rectUndock = m_rectClose;
m_rectUndock.OffsetRect(0,13);
dc.DrawFrameControl(m_rectUndock, DFC_CAPTION, DFCS_CAPTIONMAX);
gripper.top += 38;
gripper.bottom -= 10;
gripper.left += 10;
gripper.right = gripper.left+3;
dc.Draw3dRect( gripper, m_clrBtnHilight, m_clrBtnShadow );
gripper.OffsetRect(4, 0);
dc.Draw3dRect( gripper, m_clrBtnHilight, m_clrBtnShadow );
}
else {
// gripper at top
m_rectGripper.top = gripper.top;
m_rectGripper.bottom = gripper.top + 20;
m_rectGripper.left = gripper.left;
m_rectGripper.right = gripper.right - 40;
// draw close box
m_rectClose.right = gripper.right - 10;
m_rectClose.left = m_rectClose.right - 11;
m_rectClose.top = gripper.top + 7;
m_rectClose.bottom = m_rectClose.top + 11;
dc.DrawFrameControl(m_rectClose, DFC_CAPTION, DFCS_CAPTIONCLOSE);
// draw docking toggle box
m_rectUndock = m_rectClose;
m_rectUndock.OffsetRect(-13,0);
dc.DrawFrameControl(m_rectUndock, DFC_CAPTION, DFCS_CAPTIONMAX);
gripper.right -= 38;
gripper.left += 10;
gripper.top += 10;
gripper.bottom = gripper.top+3;
dc.Draw3dRect( gripper, m_clrBtnHilight, m_clrBtnShadow );
gripper.OffsetRect(0, 4);
dc.Draw3dRect( gripper, m_clrBtnHilight, m_clrBtnShadow );
}
}
void CCoolDialogBar::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if ((m_pDockBar != NULL) && (nHitTest == HTCAPTION))
{
// toggle docking
ASSERT(m_pDockContext != NULL);
m_pDockContext->ToggleDocking();
}
else
{
CWnd::OnNcLButtonDblClk(nHitTest, point);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -