如何在MFC界面上设计比较密集的控件

Simality 2011-08-05 01:00:35
首先我明白界面上如果没有必要,尽量不要放太多的控件,但我这里是必须要放,因此我想讨论肿么实现。我的开发环境是VC++ MFC。C#不太熟,不过如果有朋友力荐C#的话我会换过去的。

最终的程序是要做成Visual Studio那种停靠面板风格的,不过我目前对dialog风格的界面比较熟悉,所以干脆两种风格的都讨论讨论。这里有一个例子,是一个停靠面板风格的成熟软件,先看其中一个面板。

可折叠的表单

这是一个内容较少的面板,现在是停靠在右侧的。由3个看似列表的元素构成,点击列表名称左边的减号可以折叠对应的列表,折叠后的外观是这样:



第一组问题:
请问这种界面有没有现成的控件可以做?如果没有,自己创建用什么思路?

提这个问题是因为列表内不仅可以显示、输入数据,还可以放tick box控件和下拉菜单。注意Object Specific列表里面的Layer和Net条目,鼠标不点击的时候就像第一张图那样,你看我点击选中之后,值的右侧会出现下拉菜单的按钮。

点击那个按钮之后会出现一个列表:

在菜单中点选一项即可更新文本框中的内容。不知道这个是怎么实现的,貌似ListBox本身不允许插入其它控件。


第二组问题:
请问如果页面上的控件过多,对话框或浮动面板的面积排不下,如何让对话框或面板出现水平和垂直滚动条?如何在拖动滚动条时让显示区域内的所有内容向对应的方向整体移动?

可以参考另一个浮动面板:

可见这个面板整体是一个列表,抬头的tag是可点击的,单击后会把整个列表内容按当前列进行升续排列,再单击一次则降序排列。这个列表长宽都超出了面板尺寸,因此在底端和右侧都有滚动条。这里可以看到Color那一列里有取色控件,双击后可以打开调色板对话框来选择颜色。再次好奇这是肿么加进去的。

从这个面板上看起来纵向与横向的滚动条是借助列表来实现的。我好奇如果不希望主区域显现为列表的结构,而是一个图片之类的东东,还可以用什么其它的方式对面板或对话框添加同样的滚动条?我同样可以在那个区域里面放按钮、下拉菜单、选择框之类的控件吗?

VS很菜,请多指教,谢谢。
...全文
475 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
gz_qmc 2011-08-07
  • 打赏
  • 举报
回复
自绘---一切皆有可能
自绘-----就是那么自信
flame_kula 2011-08-07
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 akof1314 的回复:]
所有的截图可以在这里看到http://blog.csdn.net/akof1314/article/details/5615240

[/Quote]

谢谢了!效果确实强大,不过好些都不知怎么实现啊,没有源码可以研究可惜了
Simality 2011-08-07
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 gz_qmc 的回复:]
如果有机会合作,我觉得还是有项目可做的
我主要做工业控制
[/Quote]

Q上发请求了。

说实话一直想组一个团队,不过我自己也没太多米可以给,就算有人愿意帮忙,我自己都不好意思让人出力。不过真有机会合作的话,我肯定不会吝啬。
gz_qmc 2011-08-07
  • 打赏
  • 举报
回复
如果有机会合作,我觉得还是有项目可做的
我主要做工业控制
gz_qmc 2011-08-07
  • 打赏
  • 举报
回复
我需要向你学习硬件啊,我一直都想学,实际工作也很用得上
可惜一直没机会

加个QQ吧: 7199963
Simality 2011-08-07
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 gz_qmc 的回复:]
慢慢来,一个好的软件总是要经历很多升级完善的
没优化一次,都可以算是一次升级

不知道你的硬件是不是自己设计的插卡
很想了解
[/Quote]

多谢帮忙。任何一门技术都是细水长流的活,我急也没用,一步一步作着看吧。亲眼看到美国一个做了十多年软件设计的哥们用C#写的软件从第1版到第8版的演化过程。从他每版的界面布局上可以看出他的设计构思变化过程。他这样经验丰富的人都用了半年时间去完善,我就更急不得了。

我是把软件拆分成两部分:designing和coding。前一部分基本上包含版面规划、风格设计、功能安排、美工、用户体验设计、文档格式制订、通讯协议制订;后一部分就是代码的实现、运行测试、debug。

Coding阶段可以自己先挑毛病,修正design阶段没设计好的细节,反复修改到自己满意后给用户体验,alpha,feedback,beta,feedback,release,patch……

现在我的问题就是design阶段的任务已经具有一定规模了,思路还算清晰,界面布局、功能设置、通讯协议、可扩展的整体架构规划都有比较清晰的轮廓了。只是我一直算不上一个好的coder,尤其是VC++、C#之类高级语言平台上的coder。以前的代码基本都是C,平台都是芯片,规模不大,资源不多,最复杂的C应用充其量就是些函数指针。像C++里面指针、句柄满天飞的混乱场面接触不久,还有点晕。不过也在慢慢上手了。

我那硬件是USB的。从芯片选型到PCB设计、焊接、固件设计、调试全是自己搞的。这方面经验已经有8年了。
gz_qmc 2011-08-07
  • 打赏
  • 举报
回复
慢慢来,一个好的软件总是要经历很多升级完善的
没优化一次,都可以算是一次升级

不知道你的硬件是不是自己设计的插卡
很想了解
Simality 2011-08-07
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 gz_qmc 的回复:]
至于浮动的窗口,其实是自绘框架
停靠和浮动变换的时候从新计算一下位置就可以了
有现成的虚函数RecalcLayout,重载处理就可以了
红色说明部分就可以作为停靠
[/Quote]

OK,非常感谢。这里面除了坐标计算、消息传递之外还有不少美工的活要做,工作量不小。

我现在是做一个硬件管理方面的软件,硬件通讯之类都调通了,就剩界面细化、文档管理这些东西了。硬件全是自己设计的,无奈不是全能,软件还得多学习啊。
gz_qmc 2011-08-07
  • 打赏
  • 举报
回复
至于浮动的窗口,其实是自绘框架
停靠和浮动变换的时候从新计算一下位置就可以了
有现成的虚函数RecalcLayout,重载处理就可以了
红色说明部分就可以作为停靠
gz_qmc 2011-08-07
  • 打赏
  • 举报
回复
gz_qmc 2011-08-07
  • 打赏
  • 举报
回复
你说对了
自绘就是不仅仅包括好看
还包括了,各种滚动,各种按钮等等一切

其实你不自绘就是他绘,反正都要绘

他绘,你只能看结果,只能动允许你动的部分.
自绘,就是全裸给你看,细化那里都可以动动

比方说滚动条:四个对象
向前按钮,向后按钮,主体框,滑块
每个对象无非就是是起点,长度,宽度,背景和编号

剩下的就是鼠标消息时候取point.x和point.y做游戏
绑一个窗口指针给他
游戏结果是啥就发个啥消息给帮定的窗口指针
下面就是我自己做的简略的CListCtrl,和CListTab

http://hi.csdn.net/attachment/201108/2/3069272_13122520887aPr.jpg

Simality 2011-08-07
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 gz_qmc 的回复:]
自绘---一切皆有可能
自绘-----就是那么自信
[/Quote]

请问自绘的时候以下几样东西是否也一起办了?

各种滚动条、各种按钮、在程序设置为不同主题时自绘部分的色调切换、鼠标光标在自绘区域中时出现的单/双击、滚轮输入事件。

思路大致都能想出来,包括水平/垂直卷动的时候边缘裁切的问题也都能解决,只是总体架构的模块化结构还不是很清晰,是自己给封装成一堆独立的控件还是直接就在Dlg类里面写写画画?另外还有点搞不清楚的是dockable pane风格的界面上要用GDI+,是每个pane用一组DC还是整个程序用同一个DC,拿着VS生成的框架不知道在哪里插入我的GDI+代码?我感觉应该是整体用一个DC,同一套坐标,否则跨窗口拖拽图标的时候没法画了,而且边框本身也都是GDI画的。不清楚的是如何得到所绘制pane本身的rectangle。

还有个问题是对于浮动起来的面板,如果把丫拖到主窗体以外的区域,在这个面板上绘制东西,X、Y坐标是不是在Client Rectangle之外了?这个不会造成一些预料不到的问题吧?

这些问题如果LS有兴趣的话请点拨一下,我自己也会上Google逐个搜索解决。非常感谢您的回复。
无幻 2011-08-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 flame_kula 的回复:]

请问akof1314:
自带例子到哪里可以看?我想看看还有什么新内容是我没注意过的

回楼主:
第一组问题:用vs 2008 SP1或vs 2010,有个类叫CDockablePane用来管理停靠窗口的,你所谓的可折叠面板叫grid控件,有个类叫CMFCPropertyGridCtrl,可以用来实现你所说的折叠、显示、输入数据、下来组合框,至于tick box复选框,我没用过,估计也是可……
[/Quote]

所有的截图可以在这里看到http://blog.csdn.net/akof1314/article/details/5615240
hztj2005 2011-08-05
  • 打赏
  • 举报
回复
还真有写复杂。
Simality 2011-08-05
  • 打赏
  • 举报
回复
4L的链接也挺有意思,套着用CDialog。这样可以把预先排列好的控件画在内层对话框上,然后把它嵌套在尺寸较小的外层对话框里面进行移动。也是个办法,我需要消化消化。
  • 打赏
  • 举报
回复
vs2010 创建一个默认的单文档,使用VS风格,基本就是你想要的
无幻 2011-08-05
  • 打赏
  • 举报
回复
有没有你想要的界面,这些都是VS2008 SP1的自带示例
Simality 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 gz_qmc 的回复:]
楼主认为控件不是GDI的?
[/Quote]

那我孤陋寡人了,真是不知道哇。只不过那些滚动条、下拉菜单之类自己拿GDI+写起来确实比较累。我权衡了一下感觉还是现成的和DIY的混起来用要合适点。
gz_qmc 2011-08-05
  • 打赏
  • 举报
回复
每个控件要分配一个DC
非常之不和谐

既然都是GDI
何不集中到一个窗口GDI
多好

一个窗口的坐标计算比窗口传递快多了
gz_qmc 2011-08-05
  • 打赏
  • 举报
回复
楼主认为控件不是GDI的?
加载更多回复(10)

15,979

社区成员

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

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