MFC中的控件如何动态布局?

caocheng8230 2009-12-17 07:30:26
在我的界面中,有的控件需要在某些条件下隐藏,有的需要显示
有些控件形成一组,这个组在某些情况下一同显示或隐藏
然后控件的位置怎样进行调整?

但是在MFC中好像没有控件容器,不论设置 SetParent还是SetOwner都不能实现一同的消失与显示

是否只能自己用vector或者数组将它们形成一个组,然后循环显示或隐藏

不要告诉我只能一个一个SetWindowRect
...全文
1672 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuirh 2009-12-20
  • 打赏
  • 举报
回复
movewindow
caocheng8230 2009-12-20
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 jameshooo 的回复:]
在没有布局概念的框架下来做,都一样的繁,跟MFC毫无关系,整个窗口机制就是这样的,Form也是一样。可以使用WPF/浏览器控件做界面,这些都提供了不同的布局。

其实用MFC实现一套布局也不算太难,自己实现一个类,例如 CWndLayout,只要把它绑定到一个窗口,它就可以自动添加布局管理功能,同时管理所有子窗口的位置和状态。至于布局管理到底怎么做,完全看需求,可能工作量很小,也可能工作量很大。
[/Quote]

楼上的说法听起来不错,不过我以前没有接触过,有没有这方面的实例?CWndLayout怎样实现?怎样绑定到一个窗口?能否具体点?谢谢!
jameshooo 2009-12-20
  • 打赏
  • 举报
回复
在没有布局概念的框架下来做,都一样的繁,跟MFC毫无关系,整个窗口机制就是这样的,Form也是一样。可以使用WPF/浏览器控件做界面,这些都提供了不同的布局。

其实用MFC实现一套布局也不算太难,自己实现一个类,例如 CWndLayout,只要把它绑定到一个窗口,它就可以自动添加布局管理功能,同时管理所有子窗口的位置和状态。至于布局管理到底怎么做,完全看需求,可能工作量很小,也可能工作量很大。
vclongking 2009-12-20
  • 打赏
  • 举报
回复
用对话框做吧
caocheng8230 2009-12-20
  • 打赏
  • 举报
回复
我知道用MoveWindow,但是有些控件如果隐藏,其位置控件的算法都让人头大。
比如说有A,B,C三组控件
如果A,B,C都不隐藏那还好
如果A隐藏,B和C都得补充A的那个位置
如果B隐藏,C就得补充B的位置

难道这也得自己去实现么?

做程序怎么这么难,做C++程序怎么这么这么难呀!什么都得自己去实现。
dvlinker 2009-12-20
  • 打赏
  • 举报
回复
MoveWindow();
caocheng8230 2009-12-20
  • 打赏
  • 举报
回复
刚才试了试,工作量好大呀!先要分类创建对话框,然后每个对话框还要对应创建封装类,然后要将以前的那些控件变量移到新创建 的类当中,还要处理数据交换。

感觉做好的一个大的界面从上往下进行分解到不同的小的界面真得好复杂呀!
pizicai105 2009-12-19
  • 打赏
  • 举报
回复
MFC做界面本来就不是很好用
像你这样的问题,可以从模块块来看
如果是一组控件要同时显隐,有共同特征,可以将它们组成一个模块
实现方式楼上的几位已经讲得很清楚,用WND封装或用链表管理

MFC其实也可以做得跟其他语言一样强大,你可以自己封装个组件出来,将你的需求进行通用化,
贡献出来,其他人遇到相同问题也就容易解决了
Practise_Think 2009-12-19
  • 打赏
  • 举报
回复
VC不像C#那个简单,得自己一个一个来,很多都是手工的
howema 2009-12-19
  • 打赏
  • 举报
回复
GetDlgItem(IDC_XXXX)->MoveWindow(35, 50, 200,500);
zhou1xp 2009-12-19
  • 打赏
  • 举报
回复
你在Create()的时候用CRect来控制它的位置就行了,我只实现过动态创建按纽并控制它的位置,但原理是这样的
cnzdgs 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 caocheng8230 的回复:]
我是在子对话框里做的呀!

断点设置在了子对话框的DDX上时,DoDataExchange 函数都没有进去
最后那些控件都是HWnd=0
[/Quote]
子对话框是怎么创建的?应该是构造一个子对话框类对象,然后调用Create函数创建。
jameshooo 2009-12-18
  • 打赏
  • 举报
回复
人人都会遇到这个问题。
没办法,Windows窗口机制中就没有布局概念,控件位置全部需要设置绝对值,无论使用哪种方法,额外的工作量都是少不了的。
caocheng8230 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zyq5945 的回复:]
把你需要的控件都放到一个对话框中,设置对话框属性设置为子窗口,需要的时候ShowWindow(SW_SHOW),不需要的时候就ShowWindow(SW_HIDE).

[/Quote]
这样是不是会有很多的对话框呀?
也就是存在很多的对话框类与此相对应?

也就不大好管理啦?
caocheng8230 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 syq13 的回复:]
引用 1 楼 zyq5945 的回复:
把你需要的控件都放到一个对话框中,设置对话框属性设置为子窗口,需要的时候ShowWindow(SW_SHOW),不需要的时候就ShowWindow(SW_HIDE).



自己计算每个控件的位置,在初始化以及重绘窗口时都设置好每个控件的位置,这样是最简单直接的了
[/Quote]
这个方法最保险,但就是太烦琐了,特别当其中有很多不同控件的时候

开始还想用一个隐藏的列表控件来帮助排列窗口,但是该隐藏的列表控件没有HWND,也就无法实现了。
red-fly 2009-12-18
  • 打赏
  • 举报
回复
可以用另外一个CWnd窗口来做为你要显示和隐藏的控件的付窗口,比如可以是一个static,或者是另一个dialog,或者是一个图片框。
不过我没有试过,但总体思想就是这样,楼主一试便知,开始的时候可以只放一个控件上去来测试一下是否可行,可行了再把其它的控件放上去
ProgrammerNO1 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 cnzdgs 的回复:]
引用 6 楼 caocheng8230 的回复:
我是在子对话框里做的呀!

断点设置在了子对话框的DDX上时,DoDataExchange 函数都没有进去
最后那些控件都是HWnd=0

子对话框是怎么创建的?应该是构造一个子对话框类对象,然后调用Create函数创建。
[/Quote]

lz 这种方法可行么,怎样了
caocheng8230 2009-12-18
  • 打赏
  • 举报
回复
CDialogBar的DoDataExtrange还是失败,
syq13 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zyq5945 的回复:]
把你需要的控件都放到一个对话框中,设置对话框属性设置为子窗口,需要的时候ShowWindow(SW_SHOW),不需要的时候就ShowWindow(SW_HIDE).

[/Quote]

自己计算每个控件的位置,在初始化以及重绘窗口时都设置好每个控件的位置,这样是最简单直接的了
a746027209 2009-12-17
  • 打赏
  • 举报
回复
从CWnd派生一个类,自己画一个窗口,把你需要的控件类对象加入新类中,然后在新类中把各个控件创建出来
加载更多回复(9)

15,979

社区成员

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

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