懂得MFC自定义控件的给意见了
了解MFC自定义控件的给意见了
我是初学者,老板要我列一份工作计划,我不知道工作量,也不知道可行不可行,所有想到了大家,会的贴代码,不知道的给意见,介绍一些这方面的资料也行呵呵。
需求是这样的:在一个主窗体上添加一个子窗体,这个窗体贴背景图片后是半透明的可以看到全屏的主窗体,支持拖拽、放大、缩小等功能,而且还要支持创建任意多个。前几天我用窗体模拟实现了下这样的效果,但是不理想,现在想换自定义控件,大家给点意见。
MFC能用自定义控件模拟类似于.NET的Panel控件吗?
能否在做好的自定义控件上添加别的控件?
能否让自定义控件实现透明效果后在上面创建控件,画画等?
------解决方案--------------------
这些都可以做到,但估计要花费一些时间。
------解决方案--------------------
记得VCBASE上面有文章完全符合楼主的需求.
------解决方案--------------------
创建透明的窗口,然后动态在上面创建子控件?
------解决方案--------------------
这都可以, 每个控件都是一个窗口, 每个窗口上都可以添加任意的窗口!
------解决方案--------------------
从CScrollView继承一个,然后可以往里面添加Dialog,类似于Panle
以下是我实现的添加一个窗体的代码:
我是初学者,老板要我列一份工作计划,我不知道工作量,也不知道可行不可行,所有想到了大家,会的贴代码,不知道的给意见,介绍一些这方面的资料也行呵呵。
需求是这样的:在一个主窗体上添加一个子窗体,这个窗体贴背景图片后是半透明的可以看到全屏的主窗体,支持拖拽、放大、缩小等功能,而且还要支持创建任意多个。前几天我用窗体模拟实现了下这样的效果,但是不理想,现在想换自定义控件,大家给点意见。
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 消息处理程序