对于MS Access 2010,当打开十几个表单时,我需要一种灵活维护位置和Z顺序的方法。父表单可以有多个实例,每个实例都可以导致子表单的多个实例(一些background here)。
我希望用户能够选择哪个表单最顶层 - 这意味着我不希望任何表单设置为Popup
。此外,我希望在新的Child打开时基本上保留Z-Order。随着孩子的开放,父母失去了焦点;在那一点上,我希望家长能够回到原来的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&
和wFlags&
的选项时,我会得到不同的结果。此外,当我将表单设置为Popup
时(结果更好,但如上所述,我希望用户将任何表单放到顶部;因此没有Popup
)。
(嗯......我打赌Popup
(以及'Modal`)正是使API得到最佳使用的原因,因为当显示“必须回答”对话框时,控件基本上还原为Windows。 ?)
我最大的挫败感是API的文档似乎是零碎和不连贯的。我想知道,我是否坚持使用该API?还有其他我可以使用的东西吗?我喜欢除了API之外的VBA解决方案,但我想这就是API的用途。不过,有没有一种我缺少的方法?
我可以更详细地发布我的变种尝试,但我觉得我一直在黑暗中拍摄,所以我会等你的反馈。
我试过阅读The Manual。我尝试了“表单所有权”和NO/TOPMOST
。对于儿童表单,我仍然需要选择:
答案 0 :(得分:1)
对不起,迟到了!我在搜索相关问题时遇到了这个问题。
管理Z-order' Access-only'是使用Form.SetFocus。一般解决方案大纲:
只要您的所有表单都是非模态的,这都应该有效。
如果您需要模态表单,请注意它们默认位于顶部,并且您一次只能打开一个模式表单。您仍然可以使用上述逻辑,只需确保为不在顶部的每个表单设置Form.Modal = False。
这是'如何'回答,但我不能就这是否适合您的应用提供建议。
答案 1 :(得分:0)
我认为该解决方案不存在,或者不值得追求,因为它将依赖于几年内可能无法使用的Windows API库。 (这种悲观主义不是基于具体的见解;但总的来说,我看到Windows用户界面面临很大的压力,所以很容易想象事情会发生变化。)
我看到其他一些危害。用户将打开许多窗口;资源在某些时候会失败,可能在此之前,他们将从人类分析的角度失去任何优势。尽管如此,他们还是会继续超越收益递减的程度。此外,我可以期待找到一些陷阱,吞噬开发时间并最终导致投诉,无论我花多少时间来减轻它们。想想“多用户”,你就会明白我的意思。
相反,我需要重新思考这种方法。该应用程序提供复杂的,有时很多的信息。有办法做到这一点。不是这样的。我可能会删除这个OP,但是它已经获得了三次投票,所以我会等着看你的想法。我总是可以向社区wiki倾斜。