懂得MFC自定义控件的给意见了

了解MFC自定义控件的给意见了
我是初学者,老板要我列一份工作计划,我不知道工作量,也不知道可行不可行,所有想到了大家,会的贴代码,不知道的给意见,介绍一些这方面的资料也行呵呵。

需求是这样的:在一个主窗体上添加一个子窗体,这个窗体贴背景图片后是半透明的可以看到全屏的主窗体,支持拖拽、放大、缩小等功能,而且还要支持创建任意多个。前几天我用窗体模拟实现了下这样的效果,但是不理想,现在想换自定义控件,大家给点意见。

MFC能用自定义控件模拟类似于.NET的Panel控件吗?

能否在做好的自定义控件上添加别的控件?

能否让自定义控件实现透明效果后在上面创建控件,画画等?


------解决方案--------------------
这些都可以做到,但估计要花费一些时间。
------解决方案--------------------
记得VCBASE上面有文章完全符合楼主的需求.
------解决方案--------------------
创建透明的窗口,然后动态在上面创建子控件?
------解决方案--------------------
这都可以, 每个控件都是一个窗口, 每个窗口上都可以添加任意的窗口!
------解决方案--------------------
从CScrollView继承一个,然后可以往里面添加Dialog,类似于Panle
以下是我实现的添加一个窗体的代码:
C/C++ code

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