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);
	}

}

5.完成

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值