📄 sizecbar.cpp
字号:
switch(m_nDockBarID)
{
case AFX_IDW_DOCKBAR_TOP:
dwBorderStyle &= ~CBRS_BORDER_BOTTOM;
rc.DeflateRect(m_cyGripper + 2, 2, 2, m_cxEdge + 2);
m_rectBorder.top = m_rectBorder.bottom - m_cxEdge;
break;
case AFX_IDW_DOCKBAR_BOTTOM:
dwBorderStyle &= ~CBRS_BORDER_TOP;
rc.DeflateRect(m_cyGripper + 2, m_cxEdge + 2, 2, 2);
m_rectBorder.bottom = m_rectBorder.top + m_cxEdge;
m_rectGripper.OffsetRect(0, m_cxEdge);
break;
case AFX_IDW_DOCKBAR_LEFT:
dwBorderStyle &= ~CBRS_BORDER_RIGHT;
rc.DeflateRect(2, m_cyGripper + 2, m_cxEdge + 2, 6);
m_rectBorder.left = m_rectBorder.right - m_cxEdge;
break;
case AFX_IDW_DOCKBAR_RIGHT:
dwBorderStyle &= ~CBRS_BORDER_LEFT;
rc.DeflateRect(m_cxEdge + 2, m_cyGripper + 2, 2, 6);
m_rectBorder.right = m_rectBorder.left + m_cxEdge;
m_rectGripper.OffsetRect(m_cxEdge, 0);
break;
default:
m_rectBorder.SetRectEmpty();
break;
}
lpncsp->rgrc[0] = rc;
SetBarStyle(dwBorderStyle);
}
void CSizingControlBar::OnNcPaint()
{
// get window DC that is clipped to the non-client area
CWindowDC dc(this);
CRect rectClient;
GetClientRect(rectClient);
CRect rectWindow;
GetWindowRect(rectWindow);
ScreenToClient(rectWindow);
rectClient.OffsetRect(-rectWindow.left, -rectWindow.top);
dc.ExcludeClipRect(rectClient);
// draw borders in non-client area
rectWindow.OffsetRect(-rectWindow.left, -rectWindow.top);
DrawBorders(&dc, rectWindow);
// erase parts not drawn
dc.IntersectClipRect(rectWindow);
// erase NC background the hard way
HBRUSH hbr = (HBRUSH)GetClassLong(m_hWnd, GCL_HBRBACKGROUND);
::FillRect(dc.m_hDC, rectWindow, hbr);
// paint the mobile edge
dc.Draw3dRect(m_rectBorder, ::GetSysColor(COLOR_BTNHIGHLIGHT),
::GetSysColor(COLOR_BTNSHADOW));
if (m_bHasGripper)
{
// paint the gripper
CRect gripper = m_rectGripper;
if (IsHorzDocked())
{
// gripper at left
gripper.right = gripper.left + 3;
dc.Draw3dRect(gripper, ::GetSysColor(COLOR_BTNHIGHLIGHT),
::GetSysColor(COLOR_BTNSHADOW));
gripper.OffsetRect(3, 0);
dc.Draw3dRect(gripper, ::GetSysColor(COLOR_BTNHIGHLIGHT),
::GetSysColor(COLOR_BTNSHADOW));
}
else if (IsVertDocked())
{
// gripper at top
gripper.bottom = gripper.top + 3;
dc.Draw3dRect(gripper, ::GetSysColor(COLOR_BTNHIGHLIGHT),
::GetSysColor(COLOR_BTNSHADOW));
gripper.OffsetRect(0, 3);
dc.Draw3dRect(gripper, ::GetSysColor(COLOR_BTNHIGHLIGHT),
::GetSysColor(COLOR_BTNSHADOW));
}
}
ReleaseDC(&dc);
}
void CSizingControlBar::OnPaint()
{
// overridden to skip border painting based on clientrect
CPaintDC dc(this);
}
UINT CSizingControlBar::OnNcHitTest(CPoint point)
{
if (IsFloating())
return CControlBar::OnNcHitTest(point);
CRect rc;
GetWindowRect(rc);
point.Offset(-rc.left, -rc.top);
if (m_rectBorder.PtInRect(point))
return HTSIZE;
else
return HTCLIENT;
}
/////////////////////////////////////////////////////////////////////////
// CSizingControlBar implementation helpers
void CSizingControlBar::StartTracking()
{
SetCapture();
// make sure no updates are pending
RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_UPDATENOW);
m_bDragShowContent = QueryDragFullWindows();
if (!m_bDragShowContent)
m_pDockSite->LockWindowUpdate();
m_sizeOld = IsHorzDocked() ? m_sizeHorz : m_sizeVert;
CRect rect;
GetWindowRect(&rect);
m_ptOld = m_rectBorder.CenterPoint() + rect.TopLeft();
m_sizeMax = CalcMaxSize();
m_bTracking = TRUE;
if (!m_bDragShowContent)
OnTrackInvertTracker();
}
void CSizingControlBar::StopTracking(BOOL bAccept)
{
if (!m_bDragShowContent)
{
OnTrackInvertTracker();
m_pDockSite->UnlockWindowUpdate();
}
m_bTracking = FALSE;
ReleaseCapture();
if (!bAccept) // resize canceled?
{
// restore old size
if (IsHorzDocked())
m_sizeHorz = m_sizeOld;
else
m_sizeVert = m_sizeOld;
}
m_pDockSite->DelayRecalcLayout();
}
void CSizingControlBar::OnTrackUpdateSize(CPoint& point)
{
BOOL bHorz = IsHorzDocked();
CSize sizeNew = m_sizeOld;
if ((m_nDockBarID == AFX_IDW_DOCKBAR_TOP) ||
(m_nDockBarID == AFX_IDW_DOCKBAR_LEFT))
sizeNew += point - m_ptOld;
else
sizeNew -= point - m_ptOld;
// check limits
sizeNew.cx = max(m_sizeMin.cx, sizeNew.cx);
sizeNew.cy = max(m_sizeMin.cy, sizeNew.cy);
sizeNew.cx = min(m_sizeMax.cx, sizeNew.cx);
sizeNew.cy = min(m_sizeMax.cy, sizeNew.cy);
if ((sizeNew.cy == m_sizeHorz.cy) && bHorz ||
(sizeNew.cx == m_sizeVert.cx) && !bHorz)
return; // no size change
if (!m_bDragShowContent)
OnTrackInvertTracker();
if (bHorz)
m_sizeHorz = sizeNew;
else
m_sizeVert = sizeNew;
if (!m_bDragShowContent)
OnTrackInvertTracker();
else
m_pDockSite->DelayRecalcLayout();
}
CSize CSizingControlBar::CalcMaxSize()
{
// the control bar cannot grow with more than the size of
// remaining client area of the frame
CRect rect;
m_pDockSite->GetClientRect(&rect);
CSize size = rect.Size();
CWnd* pBar;
if (IsHorzDocked())
{
if (pBar = m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_TOP))
{
pBar->GetWindowRect(&rect);
size -= rect.Size();
}
if (pBar = m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_BOTTOM))
{
pBar->GetWindowRect(&rect);
size -= rect.Size();
}
if (pBar = m_pDockSite->GetControlBar(AFX_IDW_STATUS_BAR))
{
pBar->GetWindowRect(&rect);
size -= rect.Size();
}
}
else
{
if (pBar = m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_LEFT))
{
pBar->GetWindowRect(&rect);
size -= rect.Size();
}
if (pBar = m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_RIGHT))
{
pBar->GetWindowRect(&rect);
size -= rect.Size();
}
}
size -= CSize(4, 4);
size += IsHorzDocked() ? m_sizeHorz : m_sizeVert;
return size;
}
void CSizingControlBar::OnTrackInvertTracker()
{
ASSERT_VALID(this);
ASSERT(m_bTracking);
CRect rect = m_rectBorder;
CRect rectBar, rectFrame;
GetWindowRect(rectBar);
rect.OffsetRect(rectBar.TopLeft());
m_pDockSite->GetWindowRect(rectFrame);
rect.OffsetRect(-rectFrame.left, -rectFrame.top);
switch (m_nDockBarID)
{
case AFX_IDW_DOCKBAR_TOP:
rect.OffsetRect(0, m_sizeHorz.cy - m_sizeOld.cy); break;
case AFX_IDW_DOCKBAR_BOTTOM:
rect.OffsetRect(0, m_sizeOld.cy - m_sizeHorz.cy); break;
case AFX_IDW_DOCKBAR_LEFT:
rect.OffsetRect(m_sizeVert.cx - m_sizeOld.cx, 0); break;
case AFX_IDW_DOCKBAR_RIGHT:
rect.OffsetRect(m_sizeOld.cx - m_sizeVert.cx, 0); break;
}
if (IsVertDocked())
rect.bottom -= 4;
rect.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(rect.left, rect.top,
rect.Width(), rect.Height(), PATINVERT);
if (hOldBrush != NULL)
::SelectObject(pDC->m_hDC, hOldBrush);
m_pDockSite->ReleaseDC(pDC);
}
BOOL CSizingControlBar::QueryDragFullWindows() const
{
TCHAR sDragfullWindows[2];
DWORD cbDragfullWindows = sizeof(DWORD);
DWORD dwType;
HKEY hKey;
BOOL bRet = FALSE;
RegOpenKeyEx(HKEY_CURRENT_USER, _T("Control Panel\\desktop"),
0, KEY_QUERY_VALUE, &hKey);
if (!FAILED(RegQueryValueEx(hKey, _T("DragfullWindows"),
NULL, &dwType, (LPBYTE)&sDragfullWindows, &cbDragfullWindows)))
if (!_tcscmp(sDragfullWindows, _T("1")))
bRet = TRUE;
RegCloseKey(hKey);
return bRet;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -