现在的位置: 首页 > 综合 > 正文

从CScrollView继承一个,然后可以往里面添加Dialog,类似于Panle

2014年01月08日 ⁄ 综合 ⁄ 共 2470字 ⁄ 字号 评论关闭

从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 消息处理程序

抱歉!评论已关闭.