// WndContainer.cpp : implementation file
//
#include "stdafx.h"
#include "ToolsContainer.h"
#include "TCDockContext.h"
#define TC_DRAW(b, dc, func) (b) ? func(dc) : (b)
// CToolsContainer
IMPLEMENT_DYNAMIC(CToolsContainer, CDialogBar)
CToolsContainer::CToolsContainer():
m_szHorz(200,200),
m_szVert(200,200),
m_szFloating(110,230),
m_szMinWnd(64,64),
m_bRecalcNC(FALSE),
m_bDrawGripper(TRUE),
m_bDrawXbutton(TRUE),
m_bTracking(FALSE),
m_bXbuttonDown(FALSE),
m_rcTrackArea(0,0,0,0),
m_rcGripperArea(0,0,0,0),
m_rcButtonClose(0,0,0,0),
m_uTrackbarWidth(5),
m_cxMargin(2)
{
m_cxNcOffset = 3 * (m_uTrackbarWidth + m_cxMargin);
}
CToolsContainer::~CToolsContainer()
{
}
void CToolsContainer::DoDataExchange(CDataExchange* pDX)
{
// TODO: Add your specialized code here and/or call the base class
CDialogBar::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CToolsContainer, CDialogBar)
ON_WM_NCHITTEST()
ON_WM_WINDOWPOSCHANGED()
ON_WM_SIZE()
ON_WM_NCCALCSIZE()
ON_WM_NCPAINT()
ON_WM_NCLBUTTONDOWN()
ON_WM_NCLBUTTONUP()
END_MESSAGE_MAP()
////////////////////////////////
// virtual functions
////////////////////////////////
BOOL CToolsContainer::Create(LPCTSTR lpszWndTitle, CWnd *pParentWnd, const RECT &rect, UINT nID, HICON hIcon, DWORD dwStyle)
{
// must has parent
ASSERT_VALID(pParentWnd);
// cannot be both fixed and dynamic
// (CBRS_SIZE_DYNAMIC is used for resizng when floating)
ASSERT (!((dwStyle & CBRS_SIZE_FIXED) &&
(dwStyle & CBRS_SIZE_DYNAMIC)));
CString strClassName = RegisterWndClass(_T("TC"), CS_DBLCLKS, ::LoadCursor(NULL,IDC_ARROW), ::GetSysColorBrush(COLOR_BTNFACE), hIcon);
SetBarStyle(dwStyle & CBRS_ALL); // save style
dwStyle &= ~CBRS_ALL;
// dwStyle |= (WS_VISIBLE | WS_CHILD);
if(!CWnd::Create(strClassName, lpszWndTitle, dwStyle, rect, pParentWnd, nID, NULL))
{
TRACE0("Create window failed!\n");
return FALSE;
}
if((rect.right - rect.left > 0) && (rect.bottom - rect.top) > 0)
{
m_szHorz = m_szVert = m_szFloating = CSize(rect.right - rect.left, rect.bottom - rect.top);
}
// EnableToolTips(); // Enable this control has tool tips
return TRUE;
}
CString CToolsContainer::RegisterWndClass(LPCSTR lpszWndTitle, UINT classStyle, HCURSOR cursor, HBRUSH background, HICON icon)
{
_ASSERT(lpszWndTitle);
HINSTANCE hInstance = AfxGetInstanceHandle();
CString strClass;
strClass.Format(_T("%s:%x:%x:%x:%x:%x"), lpszWndTitle, (UINT_PTR)hInstance,
classStyle, (UINT_PTR)cursor, (UINT_PTR)background, (UINT_PTR)icon);
WNDCLASS wndcls;
if(::GetClassInfo(hInstance, strClass, &wndcls) == 0)
{
wndcls.style = classStyle;
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
wndcls.hInstance = hInstance;
wndcls.hIcon = icon;
wndcls.hCursor = cursor;
wndcls.hbrBackground = background;
wndcls.lpszMenuName = NULL;
wndcls.lpszClassName = strClass;
//
if(AfxRegisterClass(&wndcls)==0)
return AfxRegisterWndClass(classStyle, cursor, background, icon);
}
return strClass;
}
void CToolsContainer::SetBarStyle(DWORD dwBarStyle)
{
m_bDrawGripper = dwBarStyle & CBRS_GRIPPER;
CControlBar::SetBarStyle(dwBarStyle);
}
CSize CToolsContainer::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
{
CRect rc(0,0,0,0);
if(m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_BOTTOM) != NULL)
{
m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_BOTTOM)->GetWindowRect(rc);
}
int nHorzDockBarWidth = bStretch ? 32767 : rc.Width() + 4;
if(m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_LEFT) != NULL)
{
m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_LEFT)->GetWindowRect(rc);
}
int nVertDockBarHeight = bStretch ? 32767 : rc.Height() + 4;
if (bHorz)
{
return CSize(nHorzDockBarWidth, m_szHorz.cy);
}
else
{
return CSize(m_szVert.cx, nVertDockBarHeight);
}
}
CSize CToolsContainer::CalcDynamicLayout(int nLength, DWORD dwMode)
{
CSize szDynamic;
for(;;)
{
if(dwMode & (LM_HORZDOCK | LM_VERTDOCK)) // docked
{
if(nLength == -1)
{
GetDockingFrame()->DelayRecalcLayout();
}
szDynamic = CDialogBar::CalcDynamicLayout(nLength, dwMode);
break;
}
if(dwMode & LM_MRUWIDTH)
{
szDynamic = m_szFloating;
break;
}
if(dwMode & LM_COMMIT)
{
m_szFloating.cx = nLength;
szDynamic = m_szFloating;
break;
}
if(dwMode & LM_LENGTHY)
{
szDynamic = CSize(m_szFloating.cx, m_szFloating.cy = max(m_szMinWnd.cy, nLength));
}
else
{
szDynamic = CSize(max(m_szMinWnd.cx, nLength), m_szFloating.cy);
}
break;
}
return szDynamic;
}
#ifndef _TC_MINI_NOCAPTION_
void CToolsContainer::EnableDocking(DWORD dwDockStyle)
{
// must be CBRS_ALIGN_XXX or CBRS_FLOAT_MULTI only
ASSERT((dwDockStyle & ~(CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI)) == 0);
// CBRS_SIZE_DYNAMIC toolbar cannot have the CBRS_FLOAT_MULTI style
ASSERT(((dwDockStyle & CBRS_FLOAT_MULTI) == 0) || ((m_dwStyle & CBRS_SIZE_DYNAMIC) == 0));
m_dwDockStyle = dwDockStyle;
if (m_pDockContext == NULL)
m_pDockContext = new CTCDockContext(this);
// permanently wire the bar's owner to its current parent
if (m_hWndOwner == NULL)
m_hWndOwner = ::GetParent(m_hWnd);
}
#endif // _TC_MINI_NOCAPTION_
////////////////////////////////////
// message handlers
////////////////////////////////////
void CToolsContainer::OnWindowPosChanged(WINDOWPOS* lpwndpos)
{
CDialogBar::OnWindowPosChanged(lpwndpos);
// TODO: Add your message handler code here
if(!m_bRecalcNC)
{
m_bRecalcNC = TRUE;
// Force recalc the non-client area
SetWindowPos(NULL, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE |
SWP_NOACTIVATE | SWP_NOZORDER |
SWP_FRAMECHANGED);
m_bRecalcNC = FALSE;
}
}
void CToolsContainer::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
// TODO: Add your message handler code here and/or call default
CDialogBar::OnNcCalcSize(bCalcValidRects, lpncsp);
GetWindowRect(m_rcTrackArea);
m_rcTrackArea.OffsetRect(-m_rcTrackArea.left, -m_rcTrackArea.top);
m_rcTrackArea.DeflateRect(1, 1);
m_rcGripperArea = m_rcTrackArea;
m_rcGripperArea.DeflateRect(5, 5);
m_rcGripperArea.right -= m_cxNcOffset + m_cxMargin;
m_rcGripperArea.bottom -= m_uTrackbarWidth;
m_rcButtonClose.CopyRect(m_rcGripperArea);
CRect rc = lpncsp->rgrc[0]; // get non-client rectangle
DWORD dwBorderStyle = m_dwStyle | CBRS_BORDER_ANY; //
switch(GetParent()->GetDlgCtrlID())
{
case AFX_IDW_DOCKBAR_TOP: // docked on the top side
dwBorderStyle &= ~CBRS_BORDER_BOTTOM; // don't draw bottom
rc.DeflateRect(m_cxNcOffset, m_cxMargin, m_cxMargin, m_uTrackbarWidth + m_cxMargin);
m_rcTrackArea.top = m_rcTrackArea.bottom - m_uTrackbarWidth;
m_rcButtonClose.DeflateRect(-m_cxMargin, -m_cxMargin, 0, 0); // Calculate close button's rectangle
m_rcButtonClose.right = m_rcButtonClose.left + 3*m_uTrackbarWidth - m_cxMargin;
m_rcGripperArea.DeflateRect(0, m_cxNcOffset - 2*m_cxMargin, 0, 0);//- 2 * m_cxMargin); // Calculate gripper's rectangle
break;
case AFX_IDW_DOCKBAR_BOTTOM: // docked on the bottom side
dwBorderStyle &= ~CBRS_BORDER_TOP; //
rc.DeflateRect(m_cxNcOffset , m_uTrackbarWidth + 2, 2, 2);
m_rcTrackArea.bottom = m_rcTrackArea.top + m_uTrackbarWidth;
//m_rcGripperArea.OffsetRect(0, 3* m_uTrackbarWidth + m_cxMargin);
m_rcGripperArea.DeflateRect(0, m_cxNcOffset, 0, -2 * m_cxMargin); // Calculate gripper's rectangle
m_rcButtonClose.DeflateRect( -m_cxMargin, m_cxMargin, 0, 0); // Calculate close button's rectangle
m_rcButtonClose.right = m_rcButtonClose.left + 3 * m_uTrackbarWidth - m_cxMargin;
break;
case AFX_IDW_DOCKBAR_LEFT: // do
a mfc dock bar
需积分: 10 78 浏览量
2014-05-15
19:42:58
上传
评论
收藏 11KB ZIP 举报
mmilmf
- 粉丝: 109
- 资源: 6
最新资源
- 问题2.zip
- QT登录模块,登录时获取txt文件内账号密码进行判断,注册时写入到本地文件user.txt
- 湖南麒麟系统下,因某些原因无法正常进入系统时可以进入单用户模式
- tsunami-udp 是一款专为网络加速诞生的小工具 用TCP进行传输控制、用UDP进行数据传输
- 基于FreeRTOS、LCD1602 、STM32CubeMX、GP2Y0A21YK0F红外测距传感器的测距proteus仿真
- C语言中的一些算法和面试题
- 個人使用2個人使用2個人使用2個人使用2個人使用2
- A72BDB68-F5FA-4D0F-906E-EACAA6A1EFA5.rar
- TTP229-BSF数据手册
- 時間管理.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈