首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创造一个专业的外表(和行为!)表单设计器

创造一个专业的外表(和行为!)表单设计器
EN

Stack Overflow用户
提问于 2011-04-03 23:05:19
回答 2查看 4.3K关注 0票数 27

当我开始编程(几年前的10+ )时,有三件事让我感到惊讶:

  • 编译器/解释器(那时我知道它们是“使我的程序工作的程序”,后面经常跟着限定符“它们是什么”)
  • 代码编辑器
  • 表单设计人员

在那时候,我接受了所有的事实。我能够制作我自己的特殊用途的程序,但是“让我的程序工作的程序”,代码编辑器和表单编辑器都是由上帝创造的,我不可能把它们搞得一团糟。

然后我上了大学,上了一门正式语言处理的课程。在学习了正式语法、解析器、抽象语法树等之后,关于编译器、解释器和代码编辑器的魔力很快就消失了。编译器和解释器可以用正常和简单的方式编写,语法突出显示代码编辑器所需要的唯一不正常的东西就是Windows黑客。

然而,直到今天,表单编辑对我来说仍然是个谜。我要么缺乏制作表单设计器所需的技术知识,要么我有这样的知识,但无法找到一种方法来使用它来实现表单设计器。

使用Visual和MFC,我想实现一个表单设计器,它受到有史以来最好的表单设计器的启发:

特别是,我想模仿我最喜欢的两个特征:

  • 正在设计的表单位于容器内。因此,只要将容器调整到适当的大小,就可以在不浪费太多屏幕房地产的情况下设计任意大的窗体。
  • “调整到网格”选项使得设计专业外观的用户界面变得不那么令人沮丧。事实上,我会说使用Visual的表单设计器创建专业的用户界面实际上是简单、有趣和令人愉快的。即使是像我这样左脑的程序员。

因此,我有以下问题:

  1. 如何使窗体设计器(其中正在设计的表单位于容器内)?正在设计的表单是否是另一个窗口中包含的实际窗口?还是它只是由表单设计人员手工绘制的模型呢?
  2. Windows API和/或MFC是否包含函数和类,这些函数和类使创建“可选”项变得容易(被选中时被白色或蓝色小方框包围,被这些“边缘”之一“抓取”时可调整大小)?
  3. 如何实现“对齐到网格”功能?
EN

回答 2

Stack Overflow用户

发布于 2011-04-03 23:20:04

您实现的表单设计器几乎像普通的GUI。你有你可以拖动的东西(你的小部件),你可以点击的东西(你的按钮),你有你可以选择的东西(你放置的小部件),这就是它的真正意义。

Q:现在,如何在GUI中显示窗口?

你画它,就这么简单。

问:你是怎么把东西放在窗口里的?

答:您检查“父”对象的界限。你几乎可以说表单设计器就像一个小游戏,你有一个场景图,里面有你所有的小部件,由父子关系连接。

问:那么,如何在GUI中选择内容呢?

答:检查鼠标当前的位置,点击所有(近)小部件的边界(一个场景图只会帮助这里,就像一个四叉树)。

Q:如何在网格上对小部件?

答:对于网格对齐,让我们举一个简单的例子:假设您的实际分辨率是x轴上的100px,但是您希望您的网格在x上只具有10px的分辨率,现在假设您通过28px在实际分辨率中移动小部件。要获得网格分辨率,只需除以10,得到2.8,然后最后将小部件3块移到x上,这里的关键是舍入。只有在网格移动是>= ?.5的情况下,您才可以切换到下一个瓷砖。否则你就呆在老房子里吧。

希望这能给您一个关于如何启动表单设计器的一般提示。玩得开心。:)

(PS:不知道任何特定的WinAPI/MFC函数/类来帮助您,对不起。)

票数 6
EN

Stack Overflow用户

发布于 2011-04-04 02:08:18

只是想在@Xeo已经说过的话上加上一两点:

首先,不,你并不总是自己画出所有的内容。在正常的设计阶段,您基本上只是绘制一些看起来像控件的东西,但是(至少IIRC)它还允许您在测试模式下“运行”一个表单(当然,VC++对话框设计器会这样做,尽管VB的比较原始,但我认为它也具有这种特殊的功能)。测试模式是在你(必须)将任何代码附加到表单之前,你可以“运行”一个表单--即使点击一个按钮(例如)在周围的程序中没有做任何事情,控件本身也正常工作--一个按钮点击正常,编辑控件会让你编辑,等等。

这是通过实例化一个控件,告诉它正确的位置、大小和属性来完成的。ActiveX控件在很大程度上支持这一点,而以前的“Windows定制控件”也是如此,尽管它的复杂性要低得多。从控件的角度来看,它的工作方式与通常的完全一样,接收输入、发送通知给它的父控件等等。唯一改变的是,父控件最忽略它接收到的大多数通知,但控件并不真正知道这一点。

有两种基本的方法可以做到这一点。一个是自己创建一个控件集合,以及控件的位置、大小等,并使用CreateWindow (或CreateWindowEx等)。要创建正确类的窗口,请执行以下操作。虽然相对容易处理,但它的缺点是所有的选项卡处理都由您处理。

另一种可能是创建一个DLGTEMPLATE结构来保存有关对话框的数据,为各个控件创建一个DLGITEMTEMPLATES,最后使用CreateDialogIndirect创建一个带有这些规范的对话框,其中包含这些控件。这很乏味,但很有效,当您完成操作时,它会自动处理控件之间的选项卡(并且与任何其他对话框一样工作,因为创建它的Windows代码是相同的)。

其次,既然您已经标记了这个C++,那么您可能想看看实际上实现了一个对话框编辑器的CodeProject上的一些代码。虽然它不像一些商业编辑器那么复杂,但这是一个相当完整的表单/对话框编辑器,包含了您所询问的大部分内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5533131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档