如何在MFC中将控件置于最前面

18

如何在MFC中在设计时更改控件的Z顺序 - 即我不能在运行时使用SetWindowPos或进行此操作 - 我希望在设计器中看到更改后的z顺序(即使我必须诉诸直接编辑.rc代码)。

我有一个MFC对话框,我正在向其中添加控件。如果控件的边缘重叠,我想将一个控件置于另一个控件的前面。在Windows Forms或WPF等中,我可以将其置于最前面、置于最后面、向前移动、向后移动。但是在MFC中,我找不到这些选项,也无法确定它如何确定哪个控件在前面,因为刚添加的控件通常在之前存在的控件后面。我该如何在MFC中操作Z顺序?即使我必须直接操作.rc文件代码(即绕过设计器)。

7个回答

20

在Visual Studio 6.0中,请按以下步骤操作。

打开对话框屏幕(在设计视图中)

按下Ctrl + D

每个控件的选项卡顺序将显示出来

从您希望在运行时看到的选项卡顺序中开始单击控件(即,您首先单击的控件将具有设置为1的选项卡顺序,依此类推...)


2
这个问题涉及到视觉层叠顺序,不是标签页顺序。 - Tim Erickson
1
@TimErickson 感谢您的指出,我在4年前回答这个问题时也有同样的想法 :) 但是问题是如何在设计时进行Z顺序控制,因此我分享了当时在我的MFC对话框应用程序中使用的方法。 - Senthil
6
@Tim Erickson: 在Visual Studio中,"tab index"确实就是"z-index"。 - Antony Hatchkins

19

我认为前面的控件将是rc文件中最后出现的控件。换句话说,对话框编辑器将按照从rc文件顶部到底部遇到每个控件的顺序绘制它们,并在必要时重叠。

您可以编辑rc文件以重新排序控件,或者您可以在编辑器中更改选项卡顺序,因为选项卡顺序也是基于控件在文件中出现的顺序设置的,这两种方法都可以达到同样的效果。据我所知,MFC在设计时不提供任何其他分层重叠控件的方法。


11
GetDlgItem(IDC_MYCONTROL)->SetWindowPos(HWND_TOP,
                                        0, 0, 0, 0,
                                        SWP_NOMOVE | SWP_NOSIZE);

2
问题明确指定“在设计时”而不是在运行时。 - Tim Erickson
(编辑:MFC-Edit-Browse-Control是我的解决方案),谢谢,我必须手动解决这个问题。绘制+单击+焦点事件强制执行它们自己的顺序,我不能仅依赖于选项卡顺序。例如:按钮在CEdit上方。按钮需要在编辑框之前,否则点击会进入编辑框。但是,单击编辑框将导致它无论顺序如何都会绘制在按钮之上。 - diox8tony

9

实际上,如果您想在资源编辑器中完成此操作,您可以将该项剪切然后粘贴回去作为一个快速而简单的解决方案。只需按Ctrl-X然后按Ctrl-V即可。

编辑RC文件也可以起到相同的作用。


1
这真是救了我的一天。我有一个未使用的文本框,想要将其删除并隐藏在某个地方,但在设计视图中找不到它长达半个小时。所以我从属性中选择了它,在设计视图中点击了 ctrl-xctrl-v,(发了些咒骂),最后按下了 del 键。 - Sharky

1
GetDlgItem(IDC_CONTROL1)->SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE)

1

您可以使用CWnd::SetWindowPos()来控制控件的Z顺序,而不改变它们在父窗口中的位置。


1
MSVC 2005的对话框资源编辑器中有一个设置选项卡顺序的选项。在MSVC 2005中,它可以在格式、选项卡顺序菜单中找到。
此菜单选项显示的选项卡顺序与控件写入资源文件的顺序相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接