📄 cooldialogbar.cpp
字号:
break;
case AFX_IDW_DOCKBAR_RIGHT:
dwBorderStyle &= ~CBRS_BORDER_LEFT;
lpncsp->rgrc[0].left += m_cxEdge+m_cxBorder/2;
lpncsp->rgrc[0].right += -(3*m_cxBorder)/2;
lpncsp->rgrc[0].bottom += -(5*m_cxBorder)/2;
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)); // 绘制3D边框
DrawGripper(dc); // 绘制小叉和最大化以及双线
CRect pRect;
GetClientRect( &pRect );
InvalidateRect( &pRect, TRUE );
}
#include "resource.h"
#include "MainFrm.h"
void CCoolDialogBar::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
if (m_bTracking) return;
if((nHitTest == HTSYSMENU) && !IsFloating())
{
CMainFrame *pMain = (CMainFrame*)GetParent();
pMain->OnDockBarClose(m_uiDialogId,0);
GetDockingFrame()->ShowControlBar(this, FALSE, FALSE);
}
else if ((nHitTest == HTMINBUTTON) && !IsFloating())
m_pDockContext->ToggleDocking();
else if ((nHitTest == HTCAPTION) && !IsFloating() && (m_pDockBar != NULL))
{
ASSERT(m_pDockContext != NULL);
m_pDockContext->StartDrag(point);
}
else if ((nHitTest == HTSIZE) && !IsFloating())
StartTracking();
else
CControlBar::OnNcLButtonDown(nHitTest, point);
}
LRESULT CCoolDialogBar::OnNcHitTest(CPoint point)
{
if (IsFloating())
return CControlBar::OnNcHitTest(point); // 响应点击,注意可以屏蔽掉点击到关闭
// 也就是说可以实现无关闭的类似VC的
CRect rc; // toolbar
GetWindowRect(rc);
point.Offset(-rc.left, -rc.top);
if(m_rectClose.PtInRect(point))
{
return HTSYSMENU; // 关闭
}
else if (m_rectUndock.PtInRect(point)&&!(m_nAddtinalStyle&BAR_NOMAX))
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)
{
if (m_pDockBar != NULL)
{
ASSERT(m_pDockContext != NULL);
ClientToScreen(&point);
m_pDockContext->StartDrag(point); // 开始拖,拖其实就是计算位置然后把
} // dialog放过去
else
{
CWnd::OnLButtonDown(nFlags, point);
}
}
void CCoolDialogBar::OnLButtonDblClk(UINT nFlags, CPoint point)
{
if (m_pDockBar != NULL)
{ // 双击的用处是重新回到Dock状态或者是
ASSERT(m_pDockContext != NULL); // 外面的状态。来回交换的。
m_pDockContext->ToggleDocking();
}
else
{
CWnd::OnLButtonDblClk(nFlags, point);
}
}
void CCoolDialogBar::StartTracking()
{
SetCapture();
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);
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, //这个DC一定有特别之处,
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)
{
if( m_dwStyle & CBRS_FLOATING )
return;
m_pDockSite->RecalcLayout();
CRect gripper;
GetWindowRect( gripper );
ScreenToClient( gripper );
gripper.OffsetRect( -gripper.left, -gripper.top );
if( m_dwStyle & CBRS_ORIENT_HORZ )
{
m_rectGripper.top = gripper.top + 40;
m_rectGripper.bottom = gripper.bottom;
m_rectGripper.left = gripper.left;
m_rectGripper.right = gripper.left + 20;
m_rectClose.left = gripper.left + 6;
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);
gripper.top += 26;
gripper.bottom -= 10;
gripper.left += 8;
gripper.right = gripper.left+3;
if(!(m_nAddtinalStyle & BAR_NOMAX))
{
m_rectUndock = m_rectClose;
m_rectUndock.OffsetRect(0,13);
dc.DrawFrameControl(m_rectUndock, DFC_CAPTION, DFCS_CAPTIONMAX);
gripper.top += 12;
}
dc.Draw3dRect( gripper, m_clrBtnHilight, m_clrBtnShadow );
gripper.OffsetRect(4, 0);
dc.Draw3dRect( gripper, m_clrBtnHilight, m_clrBtnShadow );
}
else
{
m_rectGripper.top = gripper.top;
m_rectGripper.bottom = gripper.top + 20;
m_rectGripper.left = gripper.left;
m_rectGripper.right = gripper.right - 40;
m_rectClose.right = gripper.right - 10;
m_rectClose.left = m_rectClose.right - 11;
m_rectClose.top = gripper.top + 5;
m_rectClose.bottom = m_rectClose.top + 11;
dc.DrawFrameControl(m_rectClose, DFC_CAPTION, DFCS_CAPTIONCLOSE);
gripper.right -= 26;
gripper.left += 10;
gripper.top += 8;
gripper.bottom = gripper.top+3;
if(!(m_nAddtinalStyle & BAR_NOMAX))
{
m_rectUndock = m_rectClose;
m_rectUndock.OffsetRect(-13,0);
dc.DrawFrameControl(m_rectUndock, DFC_CAPTION, DFCS_CAPTIONMAX);
gripper.right -= 12;
}
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)
{
if ((m_pDockBar != NULL) && (nHitTest == HTCAPTION))
{
ASSERT(m_pDockContext != NULL);
m_pDockContext->ToggleDocking();
}
else
{
CWnd::OnNcLButtonDblClk(nHitTest, point);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -