【VC开源代码栏目提醒】:网学会员,鉴于大家对VC开源代码十分关注,论文会员在此为大家搜集整理了“DockBarCtrl.cpp”一文,供大家参考学习!
// DockBarCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "窗体融合技术.h"
#include "DockBarCtrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDockBarCtrl
CDockBarCtrl::CDockBarCtrl()
{
m_bkBrush.CreateSolidBrush(::GetSysColor(COLOR_BTNFACE));
m_Caption = "窗口融合技术";
m_ncTBandHeight = 20;
m_ncLBandWidth = 3;
m_ncRBandWidth = 6;
m_ncBBandHeight = 3;
m_TopBandColor = GetSysColor(COLOR_BTNHILIGHT);
m_BottomBandColor = GetSysColor(COLOR_BTNSHADOW);
m_IsTraking = FALSE;
m_IsInRect = FALSE;
m_Min = CSize(32,32);
}
CDockBarCtrl::~CDockBarCtrl()
{
}
BEGIN_MESSAGE_MAP(CDockBarCtrl, CControlBar)
//{{AFX_MSG_MAP(CDockBarCtrl)
ON_WM_WINDOWPOSCHANGED()
ON_WM_NCCALCSIZE()
ON_WM_NCPAINT()
ON_WM_NCLBUTTONDOWN()
ON_WM_NCHITTEST()
ON_WM_NCLBUTTONDBLCLK()
ON_WM_LBUTTONDBLCLK()
ON_WM_SETCURSOR()
ON_WM_MOUSEMOVE()
ON_WM_NCLBUTTONUP()
ON_WM_LBUTTONUP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDockBarCtrl message handlers
void CDockBarCtrl::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)
{
CWnd::UpdateDialogControls(pTarget, bDisableIfNoHndler);
}
BOOL CDockBarCtrl::Create(CWnd* pParentWnd, CDialog* pDialog, UINT nID, DWORD dwStyle, CCreateContext* pContext)
{
ASSERT_VALID(pParentWnd);
ASSERT(!((dwStyle& CBRS_SIZE_DYNAMIC)&&(dwStyle&CBRS_SIZE_FIXED )));
m_dwStyle = dwStyle & CBRS_ALL;
//注册窗口类
CString classname;
classname = AfxRegisterWndClass(CS_DBLCLKS,LoadCursor(NULL,IDC_ARROW),m_bkBrush,0);
//创建窗口类
CWnd::Create(classname,m_Caption,dwStyle,CRect(0,0,0,0),pParentWnd,0);
m_pDlg = pDialog;
m_pDlg->Create(nID,this);
m_pDlg->GetWindowRect(m_FloatRect);
m_HorRect.CopyRect(m_FloatRect);
m_VerRect.CopyRect(m_FloatRect);
return true;
}
CSize CDockBarCtrl::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
{
int dockwidth,dockheight;
CRect rc,clientrc;
m_pDockSite->GetClientRect(clientrc);
//如果当前处于浮动状态
if (IsFloating())
return CSize(m_FloatRect.Width(),m_FloatRect.Height());
else //处于固定状态
{
if (bHorz) //水平方向显示
{
m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_TOP)->GetWindowRect(rc);
dockwidth = bStretch? 1200:rc.Width()+4;
return CSize(dockwidth,m_HorRect.Height());
}
else //垂直方向显示
{
m_pDockSite->GetControlBar(AFX_IDW_DOCKBAR_LEFT)->GetWindowRect(rc);
dockheight= bStretch?1200:rc.Height()+4;
return CSize(m_VerRect.Width(),dockheight);
}
}
}
CSize CDockBarCtrl::CalcDynamicLayout(int nLength, DWORD nMode)
{
if (IsFloating())
{
//修改CMiniDockFrameWnd的风格
//允许同时调整窗口的宽度和高度
CFrameWnd* pDockFrame = GetDockingFrame();
pDockFrame->ModifyStyle(MFS_4THICKFRAME,0);
}
if (nMode&(LM_HORZDOCK|LM_VERTDOCK))
return CControlBar::CalcDynamicLayout(nLength,nMode);
if (nMode&LM_COMMIT)
return CSize(nLength,m_FloatRect.Height());
if (nMode & LM_MRUWIDTH)
return CSize(m_FloatRect.Width(),m_FloatRect.Height());
//获取CMiniDockFrameWnd的窗口区域
CRect rect;
GetParent()->GetParent()->GetWindowRect(rect);
//获取CMiniDockFrameWnd的标题栏高度
int CaptionHeight = GetSystemMetrics(SM_CYCAPTION);
if (IsFloating())
{
CPoint pt;
//获取鼠标当前位置
GetCursorPos(&pt);
m_FloatRect.left = 0;
m_FloatRect.top = 0;
//判断用户在窗体的哪个角儿开始调整大小,实际上m_pDockContext->m_nHitTest的值
//是在CMiniDockFrameWnd的OnNcLButtonDown方法中调用m_pDockContext的StartResize方法设置的
switch (m_pDockContext->m_nHitTest)
{
case HTTOPLEFT: //鼠标在左上角
{
m_FloatRect.left = 0;
m_FloatRect.top = 0;
m_FloatRect.right = (m_Min.cx > rect.right - pt.x)?m_Min.cx: (rect.right - pt.x);//调整宽度
int temp = rect.bottom - CaptionHeight - pt.y - 1;
m_FloatRect.bottom = (m_Min.cy>temp)? m_Min.cy : temp;
//调整CMiniDockFrameWnd的左上角坐标为当前移动的鼠标坐标
m_pDockContext->m_rectFrameDragHorz.top = pt.y;
m_pDockContext->m_rectFrameDragHorz.left =pt.x;
return CSize(m_FloatRect.Width(),m_FloatRect.Height());
}
case HTTOPRIGHT: //鼠标在右上角
{
m_FloatRect.left = 0;
m_FloatRect.top = 0;
m_FloatRect.right= (m_Min.cx >pt.x-rect.left)?m_Min.cx: pt.x-rect.left;
int temp = rect.bottom - CaptionHeight - pt.y - 1;
m_FloatRect.bottom = (m_Min.cy>temp)? m_Min.cy : temp;
m_pDockContext->m_rectFrameDragHorz.top = pt.y;
return CSize(m_FloatRect.Width(),m_FloatRect.Height());
}
case HTBOTTOMLEFT://鼠标在左下角
{
m_FloatRect.right = max(m_Min.cx, rect.right-pt.x);
m_FloatRect.bottom = max(m_Min.cy,pt.y-rect.top-CaptionHeight);
m_pDockContext->m_rectFrameDragHorz.left =max(m_Min.cx,pt.x);
return CSize(m_FloatRect.Width(),m_FloatRect.Height());
}
case HTBOTTOMRIGHT: //鼠标在右下角
{
m_FloatRect.right = max(m_Min.cx, pt.x-rect.left);
m_FloatRect.bottom = max(m_Min.cy,pt.y-rect.top-CaptionHeight);
m_pDockContext->m_rectFrameDragHorz.right =pt.x;
return CSize(m_FloatRect.Width(),m_FloatRect.Height());
}
}
}
if (nMode&LM_LENGTHY)//调整控制条的高度
{
m_FloatRect.top=0;
m_FloatRect.bottom= max(m_Min.cy, nLength);
return CSize(m_FloatRect.Width(),max(m_Min.cy, nLength));
}
else if (nMode&LM_HORZ)//调整控制条的宽度
{
//m_FloatRect.OffsetRect(-m_FloatRect.Width(),-m_FloatRect.Height());
m_FloatRect.top = 0;
m_FloatRect.left = 0;
m_FloatRect.right = max(m_Min.cx,nLength);
m_FloatRect.bottom = max(m_Min.cy,rect.Height()-CaptionHeight);
return CSize(max(nLength,m_Min.cx),m_FloatRect.Height());
}
}
void CDockBarCtrl::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
{
CControlBar::OnWindowPosChanged(lpwndpos);
//获取CDockBar的ID
m_DockBarID = GetParent()->GetDlgCtrlID();
if (m_IsInRect)
{
CRect rc;
GetClientRect(rc);
m_pDlg->MoveWindow(rc);
return;
}
m_pDockSite->RecalcLayout();
m_IsInRect = TRUE;
SetWindowPos(NULL, 0,0,0,0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED);
m_IsInRect = FALSE;
// m_temprc = m_Bandrc;
}
//非客户区域的计算
void CDockBarCtrl::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
{
//根据每一种排列方式计算出非客户区域
switch (m_DockBarID)
{
case AFX_IDW_DOCKBAR_TOP://控制条停靠
上一篇:
clntmain.pas
下一篇:
科研管理杂志简介