对于 MS Access 2010,我需要一种方法来在打开十几个表单时灵活地维护位置和 Z 顺序。父窗体可以有多个实例,每个实例都可以导致子窗体的多个实例(某些背景在这里 https://stackoverflow.com/q/22108012/122139).
我希望用户能够选择哪个表单是最顶层的——这意味着我不希望任何表单设置为Popup
。另外,我希望在打开新子项时基本保留 Z 顺序。当子进程打开时,父进程就失去了焦点;那时我希望父级回到其在 Z 顺序中的先前位置。我可以沿着这条线添加要求,但你明白了......我想象默认行为可能会做我想要的,但如果我必须从数组或类似的东西分配Z顺序位置,我可以接受。
我还想控制子窗体在屏幕上的位置(我的意思是仅当它们第一次打开时;它们可以重新定位)。如果他们以相同的方式打开X,Y
坐标,它们将显示为堆叠在彼此的顶部,并且用户必须重新定位顶部实例才能看到其他实例。这很不方便,而且我认为更重要的是,这会让人迷失方向。
到目前为止我还无法拥有这一切。我可以通过指定得到一个很好的级联结果X,Y
位置,但当我使用标志来戳 Z 顺序时,它停止工作。
我一直在使用 API...
Declare Sub SetWindowPos Lib "user32" ( _
ByVal Hwnd&, _
ByVal hWndInsertAfter&, _
ByVal X&, ByVal Y&, ByVal cX&, _
ByVal cY&, ByVal wFlags&)
Global Const HWND_TOP = 0
Global Const HWND_TOPMOST = -1
SetWindowPos Hwnd, HWND_TOP, lngPosX, lngPosX, 0, 0, SWP_NOSIZE
当我尝试以下选项时,我得到了不同的结果hWndInsertAfter&
and wFlags&
。另外,当我将表单设置为Popup
(结果更好,但如上所述,我希望用户将任何表单带到顶部;因此没有Popup
).
(嗯...我打赌Popup
(和“Modal”)正是使 API 得到最佳使用的原因,因为当显示“必须回答”对话框时,控制权基本上会恢复到 Windows。确认?)
我最大的挫败感是 API 的文档看起来零碎且不连贯。我想知道,我被那个 API 困住了吗?还有其他我可以使用的东西吗?除了 API 之外,我还喜欢 VBA 解决方案,但我想这就是 API 的用途。不过,我还缺少某种方法吗?
我可以更详细地发布我的变体尝试,但我觉得我一直在黑暗中拍摄,所以我会等待你的反馈。
Update
我尝试阅读手册 http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545%28v=vs.85%29.aspx。我尝试摆弄“形式所有权”并且NO/TOPMOST
。对于儿童形式,我仍然必须选择:
- 能够在开仓时设置仓位
- 能够将父表单带回到子表单的“之上”