0

我需要以“矩形”形式订购窗户。这意味着当我有六个窗口时,它以 2x3 矩形排列,当我有 5 个窗口时,它以 2x3 排列,但没有最后一个窗口,当我有 9 个窗口时,它以 3x3 排列。但是我在坐标方面遇到了一些麻烦 - 子窗口超出了 mdiparent 窗口的范围。(img)

我使用的算法与我在 java 上的 mdi 应用程序中使用的算法相同

for(int i=0;i<a;i++)
    for(int j=0;j<b;j++)
         try{
             indfr.get(counter).setLocation(i*theDesktop.getWidth()/a,j*theDesktop.getHeight()/b);
             indfr.get(counter).setSize(theDesktop.getWidth()/a,theDesktop.getHeight()/b);
             counter++;
            }catch (IndexOutOfBoundsException exc){ break;}

indfr - arralist of JInternalFrames和_theDesktop - JDesktopPane

c#中的算法

for (int i = 0; i < a; i++)
    for (int j = 0; j < b; j++)
            try
            {
                list[counter].SetDesktopLocation(i*list[counter].MdiParent.Width/a, j*list[counter].MdiParent.Height/b);
                list[counter].Size = new Size(list[counter].MdiParent.Width/a, list[counter].MdiParent.Height/b);
                counter++;
            }
            catch (IndexOutOfRangeException)
            {
                break;
            }

在哪里列出 -Form[] list = this.MdiChildern;

坐标有什么问题?(PS 这不是整个算法,但它是窗口排序的主循环)

在此处输入图像描述

4

2 回答 2

3

问题行是您的try块内的行:

list[counter].SetDesktopLocation(i*list[counter].MdiParent.Width/a, j*list[counter].MdiParent.Height/b);
list[counter].Size = new Size(list[counter].MdiParent.Width/a, list[counter].MdiParent.Height/b);
counter++;

您正在检查Form.Widthand Form.Height,它返回屏幕上表单的大小,包括所有边框。您只能将子窗口放置在父窗体的客户区域内,因此您需要查询ClientSize属性。即定义为表单的大小,减去边框和标题栏;换句话说,可以放置孩子的表单区域。

将您的块重写try为此,而不是:

list[counter].SetDesktopLocation(i*list[counter].MdiParent.ClientSize.Width/a, j*list[counter].MdiParent.ClientSize.Height/b);
list[counter].Size = new Size(list[counter].MdiParent.ClientSize.Width/a, list[counter].MdiParent.ClientSize.Height/b);
counter++;

然后摆脱那个愚蠢的空catch块。如果抛出异常时您所做break的只是ing,那么捕获异常是没有意义的。它将冒泡到下一个异常处理程序,必要时一直到全局处理程序。仅捕获您专门知道如何处理的异常。你不应该得到一个IndexOutOfRangeException,如果你得到了,那是你的代码中的一个错误——你想知道它以便你可以修复它。这意味着不要吞下异常。


Clippy,Office 助手,现在在 Stack Overflow 上!但是,如果我可以在这里引导 Clippy,看起来您正在尝试平铺您的 MDI 孩子

在这种情况下,有一种比编写一堆for循环并手动设置孩子的大小和位置更简单的方法。相反,只需调用父 MDI 表单上的Form.LayoutMdi方法,并指定MdiLayout枚举值之一。在这种情况下,您可能需要MdiLayout.TileHorizontalMdiLayout.TileVertical

WinForms 会按照您的要求自动安排您的子窗口。

于 2012-05-14T23:16:25.170 回答
2

您指定要为 5 个“没有最后一个窗口”的表单布局 2x3,我认为这意味着您想要一个空白空间,最后一个表单通常会出现?如果是这种情况,这对你没有帮助,但如果这对你来说不是很重要,你可以使用 Form.LayoutMDI 方法,它是 .NET Windows 窗体的标准部分:

LayoutMdi(MdiLayout.TileVertical);

不同之处在于它不会在上述场景中留下空白空间 - 2 个窗口会显得更大以利用空白空间。无论如何尝试一下,看看它是否对你有用。

于 2012-05-14T23:26:02.473 回答