当我开始编程(几年前的10+ )时,有三件事让我感到惊讶:
在那时候,我接受了所有的事实。我能够制作我自己的特殊用途的程序,但是“让我的程序工作的程序”,代码编辑器和表单编辑器都是由上帝创造的,我不可能把它们搞得一团糟。
然后我上了大学,上了一门正式语言处理的课程。在学习了正式语法、解析器、抽象语法树等之后,关于编译器、解释器和代码编辑器的魔力很快就消失了。编译器和解释器可以用正常和简单的方式编写,语法突出显示代码编辑器所需要的唯一不正常的东西就是Windows黑客。
然而,直到今天,表单编辑对我来说仍然是个谜。我要么缺乏制作表单设计器所需的技术知识,要么我有这样的知识,但无法找到一种方法来使用它来实现表单设计器。
使用Visual和MFC,我想实现一个表单设计器,它受到有史以来最好的表单设计器的启发:

特别是,我想模仿我最喜欢的两个特征:
因此,我有以下问题:
发布于 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函数/类来帮助您,对不起。)
发布于 2011-04-04 02:08:18
只是想在@Xeo已经说过的话上加上一两点:
首先,不,你并不总是自己画出所有的内容。在正常的设计阶段,您基本上只是绘制一些看起来像控件的东西,但是(至少IIRC)它还允许您在测试模式下“运行”一个表单(当然,VC++对话框设计器会这样做,尽管VB的比较原始,但我认为它也具有这种特殊的功能)。测试模式是在你(必须)将任何代码附加到表单之前,你可以“运行”一个表单--即使点击一个按钮(例如)在周围的程序中没有做任何事情,控件本身也正常工作--一个按钮点击正常,编辑控件会让你编辑,等等。
这是通过实例化一个控件,告诉它正确的位置、大小和属性来完成的。ActiveX控件在很大程度上支持这一点,而以前的“Windows定制控件”也是如此,尽管它的复杂性要低得多。从控件的角度来看,它的工作方式与通常的完全一样,接收输入、发送通知给它的父控件等等。唯一改变的是,父控件最忽略它接收到的大多数通知,但控件并不真正知道这一点。
有两种基本的方法可以做到这一点。一个是自己创建一个控件集合,以及控件的位置、大小等,并使用CreateWindow (或CreateWindowEx等)。要创建正确类的窗口,请执行以下操作。虽然相对容易处理,但它的缺点是所有的选项卡处理都由您处理。
另一种可能是创建一个DLGTEMPLATE结构来保存有关对话框的数据,为各个控件创建一个DLGITEMTEMPLATES,最后使用CreateDialogIndirect创建一个带有这些规范的对话框,其中包含这些控件。这很乏味,但很有效,当您完成操作时,它会自动处理控件之间的选项卡(并且与任何其他对话框一样工作,因为创建它的Windows代码是相同的)。
其次,既然您已经标记了这个C++,那么您可能想看看实际上实现了一个对话框编辑器的CodeProject上的一些代码。虽然它不像一些商业编辑器那么复杂,但这是一个相当完整的表单/对话框编辑器,包含了您所询问的大部分内容。
https://stackoverflow.com/questions/5533131
复制相似问题