📄 myctrlbar.cpp
字号:
// myCtrlBar.cpp: implementation of the CmyCtrlBar class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DspCtl.h"
#include "myCtrlBar.h"
#include <afxpriv.h> // for CDockContext
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#include "DspCtlDoc.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
static int _gColText[] =
{
IDS_COL_1,
IDS_COL_2,
IDS_COL_3
};
static int _gColSize[] =
{
60,
100,
250
};
static CString _gListText[] =
{
_T("ia"),
_T("ib"),
_T("theta")
};
CMyCtrlBar::CMyCtrlBar()
{
m_sizeMin = CSize(22, 32);
m_sizeHorz = CSize(100, 100);
m_sizeVert = CSize(50, 100);
m_sizeFloat = CSize(200, 100);
m_bTracking = FALSE;
m_bInRecalcNC = FALSE;
m_cxEdge = 5;
}
CMyCtrlBar::~CMyCtrlBar()
{
delete btn;
delete lstctrl;
}
IMPLEMENT_DYNAMIC(CMyCtrlBar, CControlBar)
BEGIN_MESSAGE_MAP(CMyCtrlBar, CControlBar)
//{{AFX_MSG_MAP(CMyCtrlBar)
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_SETCURSOR()
ON_WM_WINDOWPOSCHANGED()
ON_WM_NCPAINT()
ON_WM_NCLBUTTONDOWN()
ON_WM_NCHITTEST()
ON_WM_NCCALCSIZE()
ON_WM_LBUTTONDOWN()
ON_WM_CAPTURECHANGED()
ON_WM_LBUTTONDBLCLK()
ON_WM_PAINT()
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_MYMESSAGE,OnDeal)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyCtrlBar message handlers
void CMyCtrlBar::OnUpdateCmdUI(CFrameWnd * pTarget, BOOL bDisableIfNoHndler)
{
UpdateDialogControls(pTarget, bDisableIfNoHndler);
}
BOOL CMyCtrlBar:: Create(CWnd* pParentWnd, UINT nID, LPCTSTR lpszWindowName , CSize sizeDefault , DWORD dwStyle)
{
ASSERT_VALID(pParentWnd); // must have a parent
ASSERT (((dwStyle & CBRS_SIZE_FIXED) != CBRS_SIZE_FIXED) &&
((dwStyle & CBRS_SIZE_DYNAMIC) != CBRS_SIZE_DYNAMIC));
// save the style
SetBarStyle(dwStyle & CBRS_ALL);
CString wndclass = ::AfxRegisterWndClass(CS_DBLCLKS,
::LoadCursor(NULL, IDC_ARROW),
::GetSysColorBrush(COLOR_BTNFACE), 0);
m_sizeHorz = m_sizeVert = m_sizeFloat = sizeDefault;
dwStyle &= ~CBRS_ALL;
dwStyle &= WS_VISIBLE | WS_CHILD;
return CWnd::Create(wndclass, lpszWindowName, dwStyle,
CRect(0,0,0,0), pParentWnd, nID);
}
CSize CMyCtrlBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
{
CRect rc;
m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_TOP)->GetWindowRect(rc);
int nHorzDockBarWidth = bStretch ? 32767 : rc.Width() + 4;
m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_LEFT)->GetWindowRect(rc);
int nVertDockBarHeight = bStretch ? 32767 : rc.Height() + 4;
if (bHorz)
return CSize(nHorzDockBarWidth, m_sizeHorz.cy);
else
return CSize(m_sizeVert.cx, nVertDockBarHeight);
}
CSize CMyCtrlBar::CalcDynamicLayout(int nLength, DWORD dwMode)
{
if (dwMode & (LM_HORZDOCK | LM_VERTDOCK))
{
if (nLength == -1)
GetDockingFrame()->DelayRecalcLayout();
return CControlBar::CalcDynamicLayout(nLength,dwMode);
}
if (dwMode & LM_MRUWIDTH)
return m_sizeFloat;
if (dwMode & LM_COMMIT)
{
m_sizeFloat.cx = nLength;
return m_sizeFloat;
}
if (dwMode & LM_LENGTHY)
return CSize(m_sizeFloat.cx,
m_sizeFloat.cy = max(m_sizeMin.cy, nLength));
else
return CSize(max(m_sizeMin.cx, nLength), m_sizeFloat.cy);
}
void CMyCtrlBar::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
{
CControlBar::OnWindowPosChanged(lpwndpos);
// Find on which side are we docked
m_nDockBarID = GetParent()->GetDlgCtrlID();
if (m_bInRecalcNC == FALSE)
{
m_bInRecalcNC = TRUE;
// Force recalc the non-client area
SetWindowPos(NULL, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE |
SWP_NOACTIVATE | SWP_NOZORDER |
SWP_FRAMECHANGED);
m_bInRecalcNC = FALSE;
}
lstctrl->MoveWindow(4,lpwndpos->y+70, lpwndpos->cx-10, lpwndpos->cy-80);
Invalidate();
}
BOOL CMyCtrlBar::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if ((nHitTest != HTSIZE) || m_bTracking)
return CControlBar::OnSetCursor(pWnd, nHitTest, message);
#if defined(MFCXLIB_STATIC)
HINSTANCE hInst = AfxFindResourceHandle(
MAKEINTRESOURCE(AFX_IDC_VSPLITBAR), RT_GROUP_CURSOR);
if (IsHorzDocked())
::SetCursor(::LoadCursor(hInst, MAKEINTRESOURCE(AFX_IDC_VSPLITBAR)));
else
::SetCursor(::LoadCursor(hInst, MAKEINTRESOURCE(AFX_IDC_HSPLITBAR)));
#else
if (IsHorzDocked())
::SetCursor(::LoadCursor(NULL, IDC_SIZENS));
else
::SetCursor(::LoadCursor(NULL, IDC_SIZEWE));
#endif
return TRUE;
}
BOOL CMyCtrlBar::IsHorzDocked() const
{
return (m_nDockBarID == AFX_IDW_DOCKBAR_TOP ||
m_nDockBarID == AFX_IDW_DOCKBAR_BOTTOM);
}
BOOL CMyCtrlBar::IsVertDocked() const
{
return (m_nDockBarID == AFX_IDW_DOCKBAR_LEFT ||
m_nDockBarID == AFX_IDW_DOCKBAR_RIGHT);
}
/*
*/
void CMyCtrlBar::OnNcPaint()
{
// get window DC that is clipped to the non-client area
CWindowDC dc(this);
CRect rectWindow;
GetWindowRect(rectWindow);
ScreenToClient(rectWindow);
CRect rectClient;
GetClientRect(rectClient);
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
dc.FillRect(rectWindow, &CBrush(::GetSysColor(COLOR_BTNFACE)));
// paint the mobile edge
dc.Draw3dRect(m_rectBorder, ::GetSysColor(COLOR_BTNHIGHLIGHT),
::GetSysColor(COLOR_BTNSHADOW));
ReleaseDC(&dc);
}
UINT CMyCtrlBar::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;
}
BOOL CMyCtrlBar::IsFloating()
{
return (!IsHorzDocked() && !IsVertDocked());
}
void CMyCtrlBar::StopTracking(BOOL bAccept)
{
OnInvertTracker(m_rectTracker);
m_pDockSite->UnlockWindowUpdate();
m_bTracking = FALSE;
ReleaseCapture();
if (!bAccept)
return;
int maxsize, minsize, newsize;
CRect rcc;
m_pDockSite->GetClientRect(rcc);
newsize = IsHorzDocked() ? m_sizeHorz.cy : m_sizeVert.cx;
maxsize = newsize + (IsHorzDocked() ? rcc.Height() : rcc.Width());
minsize = IsHorzDocked() ? 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 (IsHorzDocked())
m_sizeHorz.cy = newsize;
else
m_sizeVert.cx = newsize;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -