在多屏幕上协调消息框或对话框位置

时间:2013-05-06 17:48:33

标签: c# winforms forms modal-dialog class-library

我有主窗体Form1(Winform)的App1。 Form1启动Form2的非模态形式。 Form2使用类库CL1,它显示模式对话框DL1。

一旦显示Form2,然后显示DL1,DL1的位置就在Form2上。

当显示Form2,然后通过将其拖动到另一个屏幕来更改其位置时,显示的DL1将超过Form2的原始位置(拖动前的位置)。我希望能够协调DL1在Form2上的位置,即使它移动了。

我做过一些研究,但还没有可靠的解决方案。我希望能在这里讨论这个问题。

基本上DL1需要其父位置。由于父类是一个类库,因此可能使用我假设的一些Windows算法来显示DL1。

我尝试在关闭时保存Form2的位置,并且每个位置都会更改。希望在启动DL1时使用它。我认为它可能有用,但是你必须为每个对话框或消息框注册和维护。

顺便说一句,可能有App2和App3使用CL1。

提前感谢。

1 个答案:

答案 0 :(得分:0)

在DL1上调用ShowDialog()之前,您需要将StartPosition属性设置为FormStartPosition.Manual。然后DL1将在您指定其位置的任何位置启动。

例如

Form2 dlg = new Form2();
dlg.StartPosition = FormStartPosition.Manual;
dlg.Location = this.Location;
dlg.ShowDialog();

这将启动dlg作为模式对话框,与调用代码的表单位于同一位置。

或者在DL1中重载ShowDialog函数,例如:

public void ShowDialog(Point start)
{
    this.StartPosition = FormStartPosition.Manual;
    this.Location = start;
    this.ShowDialog();
}