MFC DockPane 分割窗口
创建工程
1.生成MFC工程
一直下一步不进行更改。
view中的基类选择CFormView
2.新建基类为CDockablePane的C++类
2.1 新建CObjectWnd类
#pragma once
#include "ShowProcess.h"
// CObjectWnd
class CObjectWnd : public CDockablePane
{
DECLARE_DYNAMIC(CObjectWnd)
public:
CShowProcess dlg;
public:
CObjectWnd();
virtual ~CObjectWnd();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType, int cx, int cy);
};
// ObjectWnd.cpp : 实现文件
//
#include "stdafx.h"
#include "MyDemo.h"
#include "ObjectWnd.h"
// CObjectWnd
IMPLEMENT_DYNAMIC(CObjectWnd, CDockablePane)
CObjectWnd::CObjectWnd()
{
}
CObjectWnd::~CObjectWnd()
{
}
BEGIN_MESSAGE_MAP(CObjectWnd, CDockablePane)
ON_WM_CREATE()
ON_WM_SIZE()
END_MESSAGE_MAP()
// CObjectWnd 消息处理程序
int CObjectWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDockablePane::OnCreate(lpCreateStruct) == -1)
return -1;
dlg.Create(IDD_DIALOG_PROCESS,this);
dlg.ShowWindow(SW_SHOW);
return 0;
}
void CObjectWnd::OnSize(UINT nType, int cx, int cy)
{
CDockablePane::OnSize(nType, cx, cy);
if (dlg.GetSafeHwnd())
{
CRect rect;
GetClientRect(rect);
dlg.MoveWindow(rect);
}
}
2.2 在CMainFrame中操作
新建变量m_wndObject
新建函数:CreateDockingWindows()
BOOL CMainFrame::CreateDockingWindows()
{
CString strObjectView("处理过程");
if (!m_wndObject.Create(strObjectView, this, CRect(0, 0, 200, 200), TRUE, 1001, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))
{
TRACE0("未能创建“面向对象”窗口\n");
return FALSE; // 未能创建
}
}
在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
中添加:
CreateDockingWindows();
m_wndObject.EnableDocking(CBRS_ALIGN_ANY); //使可停靠与浮动
DockPane(&m_wndObject);
以上即完成停靠窗口的创建工作。
3.新建对话框类,在停靠窗口中写入对话框
3.1 新建对话框资源
新建对话框,ID设置为IDD_DIALOG_PROCESS
,对话框Border属性设置为None,Style设置为Child
,生成对话框类CShowProcess
3.2 在停靠窗口中嵌入对话框
在CObjectWnd
中定义对话框变量
CShowProcess dlg;
同时在CObjectWnd
类中添加OnCreate(),OnSize()消息
。
int CObjectWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDockablePane::OnCreate(lpCreateStruct) == -1)
return -1;
dlg.Create(IDD_DIALOG_PROCESS,this);
dlg.ShowWindow(SW_SHOW);
return 0;
}
void CObjectWnd::OnSize(UINT nType, int cx, int cy)
{
CDockablePane::OnSize(nType, cx, cy);
if (dlg.GetSafeHwnd())
{
CRect rect;
GetClientRect(rect);
dlg.MoveWindow(rect);
}
}
完成对话框的嵌入工作。
4.在对话框中添加控件,使控件大小随拖动进行变化
需要在对话框中响应OnInitDialog(),OnSize()消息
关键代码:
BOOL CShowProcess::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化
if (m_ListShow.GetSafeHwnd())
{
CRect rect;
GetClientRect(rect);
m_ListShow.MoveWindow(rect);
}
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CShowProcess::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
if (m_ListShow.GetSafeHwnd())
{
CRect rect;
GetClientRect(rect);
m_ListShow.MoveWindow(rect);
}
}