#include "pch.h"
#include "CHorzSplitter.h"
IMPLEMENT_DYNAMIC(CHorzSplitter, CStatic)
CHorzSplitter::CHorzSplitter()
:CStatic()
, m_pParent(NULL)
, m_iTopMin(10)
, m_iBottomMin(10)
{}
CHorzSplitter::~CHorzSplitter()
{}
void CHorzSplitter::SetMinHeight(int Top, int Bottom)
{
m_iTopMin = Top;
m_iBottomMin = Bottom;
}
BOOL CHorzSplitter::AttachCtrlAsTopPane(DWORD idCtrl)
{
m_idTop.Add(idCtrl);
return TRUE;
}
BOOL CHorzSplitter::AttachCtrlAsBottomPane(DWORD idCtrl)
{
m_idBottom.Add(idCtrl);
return TRUE;
}
BOOL CHorzSplitter::DetachAllPanes()
{
m_idTop.RemoveAll();
m_idBottom.RemoveAll();
return TRUE;
}
void CHorzSplitter::AdjustLayout()
{
CWnd* pane;
RECT rcBar, rcPane;
GetWindowRect(&rcBar);
m_pParent->ScreenToClient(&rcBar);
int i;
DWORD id;
for (i = 0; i < m_idTop.GetSize(); i++) {
id = m_idTop.GetAt(i);
pane = m_pParent->GetDlgItem(id);
pane->GetWindowRect(&rcPane);
m_pParent->ScreenToClient(&rcPane);
rcPane.bottom = rcBar.bottom - 5;
pane->MoveWindow(&rcPane, FALSE);
}
for (i = 0; i < m_idBottom.GetSize(); i++)
{
id = m_idBottom.GetAt(i);
pane = m_pParent->GetDlgItem(id);
pane->GetWindowRect(&rcPane);
m_pParent->ScreenToClient(&rcPane);
rcPane.top = rcBar.bottom + 1;
pane->MoveWindow(&rcPane, FALSE);
}
m_pParent->Invalidate();
}
BEGIN_MESSAGE_MAP(CHorzSplitter, CStatic)
ON_WM_SETCURSOR()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
BOOL CHorzSplitter::GetMouseClipRect(LPRECT rcClip, CPoint point)
{
RECT rcOrg, rcTarget, rcParent, rcPane;
DWORD id;
GetWindowRect(&rcOrg);
m_pParent->GetClientRect(&rcParent);
m_pParent->ClientToScreen(&rcParent);
rcTarget = rcOrg;
rcTarget.top = rcParent.top + m_iTopMin;
for (int i = 0; i < m_idTop.GetSize(); i++) {
id = m_idTop.GetAt(i);
m_pParent->GetDlgItem(id)->GetWindowRect(&rcPane);
if (rcTarget.top < rcPane.top + m_iTopMin) {
rcTarget.top = rcPane.top + m_iTopMin;
}
}
rcTarget.bottom = rcParent.bottom - m_iBottomMin;
for (int i = 0; i < m_idBottom.GetSize(); i++)
{
id = m_idBottom.GetAt(i);
m_pParent->GetDlgItem(id)->GetWindowRect(&rcPane);
if (rcTarget.bottom > rcPane.bottom - m_iBottomMin) {
rcTarget.bottom = rcPane.bottom - m_iBottomMin;
}
}
if (rcTarget.top >= rcTarget.bottom) {
TRACE(_T("No room to drag the x-splitter bar"));
return FALSE;
}
//point指的是窗口的客户坐标,而不是屏幕坐标
rcClip->top = rcTarget.top + point.y;
rcClip->bottom = rcTarget.bottom - (rcOrg.bottom - rcOrg.top - point.y) + 1;
rcClip->left = rcOrg.left;
rcClip->right = rcOrg.right;
return TRUE;
}
BOOL CHorzSplitter::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
//以下非常奇怪,用全局函数可以,但是用CStatic方法却不行
//if (GetCursor() == NULL)
// SetCursor(::LoadCursor(NULL, IDC_HELP));
::SetCursor(::LoadCursor(NULL, IDC_SIZENS));
return TRUE;
}
void CHorzSplitter::OnLButtonDown(UINT nFlags, CPoint point)
{
//如果鼠标被别的程序捕获,不再处理此消息
if (::GetCapture() != NULL) return;
m_pParent = GetParent();
if (!m_pParent) return;
//ClipCursor限定鼠标移动范围
CRect rcMouseClip;
if (!GetMouseClipRect(rcMouseClip, point)) return;
::ClipCursor(&rcMouseClip);
m_pPointStart = point;
SetCapture(); //捕获鼠标输入
GetWindowRect(m_rcOrgRect);
m_pParent->ScreenToClient(m_rcOrgRect);
CDC* pDrawDC = NULL;
pDrawDC = m_pParent->GetDC();
pDrawDC->DrawDragRect(m_rcOrgRect, CSize(1, 1), NULL, CSize(1, 1));
m_rcOldRect = m_rcOrgRect;
m_pParent->ReleaseDC(pDrawDC);
}
void CHorzSplitter::OnMouseMove(UINT nFlags, CPoint point)
{
if (GetCapture() == this)
{
CDC* pDrawDC = NULL;
pDrawDC = m_pParent->GetDC();
CRect rcCur = m_rcOrgRect;
long xDiff = 0, yDiff = 0;
xDiff = point.x - m_pPointStart.x;
yDiff = point.y - m_pPointStart.y;
rcCur.OffsetRect(0, yDiff);
pDrawDC->DrawDragRect(rcCur, CSize(1, 1), &m_rcOldRect, CSize(1, 1));
m_rcOldRect = rcCur;
m_pParent->ReleaseDC(pDrawDC);
}
}
void CHorzSplitter::OnLButtonUp(UINT nFlags, CPoint point)
{
if (GetCapture() == this)
{
CDC* pDrawDC = NULL;
pDrawDC = m_pParent->GetDC(); //获取DC
//可以采用下列两种方式之一
//pDrawDC->DrawDragRect(m_rcOldRect, CSize(1, 1), NULL, CSize(1, 1));
pDrawDC->DrawDragRect(CRect(0, 0, 0, 0), CSize(1, 1), m_rcOldRect, CSize(1, 1));
m_pParent->ReleaseDC(pDrawDC);
::ReleaseCapture();
MoveWindow(m_rcOldRect);
AdjustLayout();
}
::ClipCursor(NULL);
}
没有合适的资源?快使用搜索试试~ 我知道了~
MFC对话框分割条拖动控件
共21个文件
h:8个
cpp:5个
rc2:1个
需积分: 5 2 下载量 105 浏览量
2022-04-28
19:21:54
上传
评论 1
收藏 137KB ZIP 举报
温馨提示
MFC对话框分割条拖动控件,水平垂直任意分隔拖动
资源详情
资源评论
资源推荐
收起资源包目录
WndSplitTest220428.zip (21个子文件)
WndSplitTest
CVertSplitter.h 1KB
WndSplitTest.vcxproj.filters 2KB
framework.h 2KB
WndSplitTest.vcxproj 10KB
pch.h 544B
res
WndSplitTest.ico 66KB
WndSplitTest.rc2 680B
WndSplitTestDlg.h 780B
targetver.h 299B
WndSplitTest.h 514B
WndSplitTest.cpp 3KB
WndSplitTest.aps 107KB
pch.cpp 158B
WndSplitTest.vcxproj.user 168B
WndSplitTest.sln 1KB
CVertSplitter.cpp 5KB
resource.h 921B
WndSplitTestDlg.cpp 4KB
CHorzSplitter.h 1KB
WndSplitTest.rc 11KB
CHorzSplitter.cpp 5KB
共 21 条
- 1
燕17
- 粉丝: 1
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0