了解MFC自定义控件的给意见了

_Sodo_ 2011-03-04 09:50:13
我是初学者,老板要我列一份工作计划,我不知道工作量,也不知道可行不可行,所有想到了大家,会的贴代码,不知道的给意见,介绍一些这方面的资料也行呵呵。

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

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

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

能否让自定义控件实现透明效果后在上面创建控件,画画等?
...全文
1318 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
rqf1985 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

这个是我正在模拟的QQ界面效果图,楼主不妨猜猜是用什么做的,要是想看看程序也行,只是暂未完成,基本界面差不多了
[/Quote]

界面很漂亮,能否给我发一份学习学习。十分感谢!
星云飞龙 2012-09-23
  • 打赏
  • 举报
回复
这个很不错,能麻烦给我来一个,我的QQ是744318265
luawkk 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 hkf314 的回复:]

这个是我正在模拟的QQ界面效果图,楼主不妨猜猜是用什么做的,要是想看看程序也行,只是暂未完成,基本界面差不多了
[/Quote]

本人是做通讯方面的,在界面上有些欠缺,看到 界面做的不错,能否发份学习学习 谢谢 luawkk@163.com,万分感谢
海岛椰风 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 hkf314 的回复:]
后者,GDI/GDI+加部分标准控件
[/Quote]

hkf314,能让我看看程序吗?我也在学gui画控件.
_Sodo_ 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 draculamx 的回复:]

WPF,在发布的时候,能摆脱 .NET 运行库吗???
求证~~~~~~
[/Quote]

当然不行了
draculamx 2011-03-07
  • 打赏
  • 举报
回复
WPF,在发布的时候,能摆脱 .NET 运行库吗???
求证~~~~~~
_Sodo_ 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 psbeond 的回复:]

引用 10 楼 coubulaji 的回复:
引用 9 楼 draculamx 的回复:

用VC做GUI是我这辈子最烦躁的一件事情。。。。。


那你有什么好办法吗?我也很无奈呀,我先前用的WPF很爽呀,微软会为MFC出一个图形界面的IDE吗?得团结起来解决烦躁呀。


那为什么不用WPF呢?wpf比mfc要强大多了。
[/Quote]

已经用WPF做过了,老板要做C++版本的,要WPF那样的效果,我都快哭了...
psbeond 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 coubulaji 的回复:]
引用 9 楼 draculamx 的回复:

用VC做GUI是我这辈子最烦躁的一件事情。。。。。


那你有什么好办法吗?我也很无奈呀,我先前用的WPF很爽呀,微软会为MFC出一个图形界面的IDE吗?得团结起来解决烦躁呀。
[/Quote]

那为什么不用WPF呢?wpf比mfc要强大多了。
手机写程序 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 coubulaji 的回复:]
引用 6 楼 eyey1 的回复:

MFC能用自定义控件模拟类似于.NET的Panel控件吗?
没用过Panel控件,不好说。

能否在做好的自定义控件上添加别的控件?
可以,但不知道你要如何支持透明。这个有影响。

能否让自定义控件实现透明效果后在上面创建控件,画画等?
建议你以cdialog作为基类,而不是cwnd,然后用SetLayeredWindowAttributes……
[/Quote]
这个我试过了,窗体完全透明后你怎么鼠标拖拽移动?
拖动不透明的区域。

我是两层窗体模拟的,创意一个可以,多个移动的话就抛异常,我也不知道怎么回事,所以才放弃用这种方法的,
如果解决这个bug就可以用了吧。

还有就是用窗体有个层级的问题,当我按window + D 键最小化后,动态创建的那些窗体不最小化,哎,我也是迫不得已。
我这里没这个问题,是不是和窗口风格,父窗口等有关系?
菜鸟二号 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 coubulaji 的回复:]
引用 9 楼 draculamx 的回复:

用VC做GUI是我这辈子最烦躁的一件事情。。。。。


那你有什么好办法吗?我也很无奈呀,我先前用的WPF很爽呀,微软会为MFC出一个图形界面的IDE吗?得团结起来解决烦躁呀。
[/Quote]


听别人说,MFC迟早淘汰,反正我不用,而很多的界面库全部自己写,及时修改,边用边写也未尝不好,不用依附于别人的库,如果别人哪天要收费了岂不不划算
_Sodo_ 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 draculamx 的回复:]

用VC做GUI是我这辈子最烦躁的一件事情。。。。。
[/Quote]

那你有什么好办法吗?我也很无奈呀,我先前用的WPF很爽呀,微软会为MFC出一个图形界面的IDE吗?得团结起来解决烦躁呀。
draculamx 2011-03-04
  • 打赏
  • 举报
回复
用VC做GUI是我这辈子最烦躁的一件事情。。。。。
_Sodo_ 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 eyey1 的回复:]

MFC能用自定义控件模拟类似于.NET的Panel控件吗?
没用过Panel控件,不好说。

能否在做好的自定义控件上添加别的控件?
可以,但不知道你要如何支持透明。这个有影响。

能否让自定义控件实现透明效果后在上面创建控件,画画等?
建议你以cdialog作为基类,而不是cwnd,然后用SetLayeredWindowAttributes实现透明。这样的话在上面创建控件,画画,……
[/Quote]

这个我试过了,窗体完全透明后你怎么鼠标拖拽移动?我是两层窗体模拟的,创意一个可以,多个移动的话就抛异常,我也不知道怎么回事,所以才放弃用这种方法的,还有就是用窗体有个层级的问题,当我按window + D 键最小化后,动态创建的那些窗体不最小化,哎,我也是迫不得已。
手机写程序 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shenyi0106 的回复:]
从CScrollView继承一个,然后可以往里面添加Dialog,类似于Panle
以下是我实现的添加一个窗体的代码:

C/C++ code

#pragma once
// CTemplateView 视图
/****************************************************************
* 类 名 称 : CTemplate……
[/Quote]
兄弟,你代码注释里泄了。。。
手机写程序 2011-03-04
  • 打赏
  • 举报
回复
MFC能用自定义控件模拟类似于.NET的Panel控件吗?
没用过Panel控件,不好说。

能否在做好的自定义控件上添加别的控件?
可以,但不知道你要如何支持透明。这个有影响。

能否让自定义控件实现透明效果后在上面创建控件,画画等?
建议你以cdialog作为基类,而不是cwnd,然后用SetLayeredWindowAttributes实现透明。这样的话在上面创建控件,画画,拖拽,放大等功能比较好实现。
shenyi0106 2011-03-04
  • 打赏
  • 举报
回复
从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 消息处理程序

迷途的书童 2011-03-04
  • 打赏
  • 举报
回复
这都可以, 每个控件都是一个窗口, 每个窗口上都可以添加任意的窗口!
Eleven 2011-03-04
  • 打赏
  • 举报
回复
创建透明的窗口,然后动态在上面创建子控件?
傻X 2011-03-04
  • 打赏
  • 举报
回复
记得VCBASE上面有文章完全符合楼主的需求.
wuhuwy 2011-03-04
  • 打赏
  • 举报
回复
这些都可以做到,但估计要花费一些时间。
加载更多回复(4)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧