从CScrollView继承一个,然后可以往里面添加Dialog,类似于Panle
以下是我实现的添加一个窗体的代码:
#pragma once
// CTemplateView 视图
/****************************************************************
* 类 名 称 : CTemplateView *
* 作 用 : 提供展现控件的模板显示; *
* 用 法 : 可以先初始化这个类,然后调用CreateFromStatic函数 *
* 将此控件绑定到父窗体上的一个控件上(一般是Static),*
* 然后通过AddControl函数将一个CWnd控件添加到这个模 *
* 板中并显示。可以不断的调用AddControl函数来显示不 *
* 同的展现内容。 *
* 作 者 :新业务开发部——沈毅 *
* 时 间 :2010/12/1 *
* 版 权 : 天源迪科合肥分公司 *
****************************************************************/
class CTemplateView : public CScrollView
{
DECLARE_DYNCREATE(CTemplateView)
public:
CTemplateView(); // 动态创建所使用的受保护的构造函数
virtual ~CTemplateView();
protected:
virtual void OnDraw(CDC* pDC); // 重写以绘制该视图
virtual void OnInitialUpdate(); // 构造后的第一次
public:
//将此View控件绑定到调用窗体的一个控件上(一般而言是Static控件)
//nID : Static控件的ID
//pParent: 父窗体的指针(也就是调用窗体的指针)
BOOL CreateFromStatic(UINT nID, CWnd* pParent);
//将一个Dlg添加到View中
//pWnd:要添加的窗口控件,可以是任何CWnd窗体,但是必须是创建完毕的(即只需要调用ShowWindow就可以显示的)
// 一般这里是显示对话框
BOOL AddControl(CWnd * pWnd);
//获取此控件的父控件指针
CWnd * GetParentWnd();
private:
//当前显示的窗体指针
CWnd * pCurrWnd;
//父窗口指针
CWnd * pParentWnd;
DECLARE_MESSAGE_MAP()
};
// TemplateView.cpp : 实现文件
//
#include "stdafx.h"
#include "TemplateView.h"
// CTemplateView
IMPLEMENT_DYNCREATE(CTemplateView, CScrollView)
CTemplateView::CTemplateView()
{
pCurrWnd = NULL;
}
CTemplateView::~CTemplateView()
{
}
BEGIN_MESSAGE_MAP(CTemplateView, CScrollView)
END_MESSAGE_MAP()
// CTemplateView 绘图
void CTemplateView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: 计算此视图的合计大小
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}
void CTemplateView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: 在此添加绘制代码
}
BOOL CTemplateView::CreateFromStatic(UINT nID, CWnd* pParent)
{
CStatic wndStatic;
if (!wndStatic.SubclassDlgItem(nID, pParent))
return FALSE;
//记录父窗体指针
pParentWnd = pParent;
// Get static control rect, convert to parent's client coords.
CRect rc;
wndStatic.GetWindowRect(&rc);
pParent->ScreenToClient(&rc);
wndStatic.DestroyWindow();
// create HTML control (CHtmlView)
BOOL IsSuc = Create(NULL, // class name
NULL, // title
(WS_CHILD | WS_VISIBLE ), // style
rc, // rectangle
pParent, // parent
nID, // control ID
NULL);
if(IsSuc)
{
this->OnInitialUpdate();
}// frame/doc context not used
return IsSuc;
}
BOOL CTemplateView::AddControl(CWnd * pWnd)
{
//如果当前有控件在显示,则隐藏之
if(pCurrWnd != NULL)
{
pCurrWnd->ShowWindow(SW_HIDE);
}
//获取父控件(也就是view控件的坐标位置)
RECT rect;
this->GetClientRect(&rect);
//设置控件位置
pWnd->SetWindowPos(NULL,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,SWP_DRAWFRAME);
//设置父控件
pWnd->SetParent(this);
pWnd->ShowWindow(SW_SHOW);
//将现在显示的控件变成当前控件
pCurrWnd = pWnd;
return TRUE;
}
// CTemplateView 消息处理程序