📄 sizecbar.cpp
字号:
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;
CRect gripper;
GetWindowRect( gripper );
ScreenToClient( gripper );
gripper.OffsetRect( -gripper.left, -gripper.top );
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));
// 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 + 3;
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 += 5;
gripper.right = gripper.left+3;
dc.Draw3dRect( gripper, ::GetSysColor(COLOR_BTNHIGHLIGHT),
::GetSysColor(COLOR_BTNSHADOW) );
gripper.OffsetRect(4, 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));
*/
// gripper at top
/* m_rectGripper.top = gripper.top;
m_rectGripper.bottom = gripper.top + 20;
m_rectGripper.left = gripper.left;
m_rectGripper.right = gripper.right - 24;
*/
// draw close box
m_rectClose.right = gripper.right - 10;
m_rectClose.left = m_rectClose.right - 11;
m_rectClose.top = gripper.top+3;//+ 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 += 5;
gripper.bottom = gripper.top + 3;
dc.Draw3dRect( gripper, ::GetSysColor(COLOR_BTNHIGHLIGHT),
::GetSysColor(COLOR_BTNSHADOW) );
gripper.OffsetRect(0, 4);
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_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);
*/
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;
}
void CSizingControlBar::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
// TODO: Add your message handler code here and/or call default
/* if (m_bTracking) return;
if ((nHitTest == HTSIZE) && !IsFloating())
StartTracking();
else
CControlBar::OnNcLButtonDown(nHitTest, point);
*/
if (m_bTracking) return;
if((nHitTest == HTSYSMENU) && !IsFloating())
{
// CFrameWnd::ShowControlBar((CControlBar*),((GetStyle() & WS_VISIBLE)==0),FALSE);
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);
CControlBar::OnNcLButtonUp(nHitTest, point);
}
void CSizingControlBar::OnNcMouseMove(UINT nHitTest, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWindowDC dc(this);
if(!(m_rectClose.PtInRect(point)) && !IsFloating())
dc.DrawEdge(m_rectClose,EDGE_RAISED,BF_RECT);
if(!(m_rectUndock.PtInRect(point)) && !IsFloating())
dc.DrawEdge(m_rectUndock,EDGE_RAISED,BF_RECT);
CControlBar::OnNcMouseMove(nHitTest, point);
}
void CSizingControlBar::ShowContrl(BOOL m_show)
{
if(m_show)
ShowWindow(SW_SHOWNORMAL);
else
ShowWindow(SW_HIDE);
}
void CSizingControlBar::SetStatusText(UINT nID)
{
if(nID==0)//HTSYSMENU
nID=AFX_IDS_IDLEMESSAGE;
CWnd *pWnd=AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
if(pWnd)
{
AfxGetMainWnd()->SendMessage(WM_SETMESSAGESTRING ,nID);
pWnd->SendMessage(WM_IDLEUPDATECMDUI);
pWnd->UpdateWindow();
}
}
BOOL CSizingControlBar::OnTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult )
{
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
UINT nID =pNMHDR->idFrom;
if (pTTT->uFlags & TTF_IDISHWND)
{
nID = ::GetDlgCtrlID((HWND)nID);
if(nID)
{
CString szFullText;
CString StrTipText;
szFullText.LoadString(nID);
AfxExtractSubString(StrTipText,szFullText,1,'\n');
if(!StrTipText.IsEmpty())
strcpy(pTTT->lpszText,StrTipText);
pTTT->hinst = AfxGetResourceHandle();
return(TRUE);
}
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -