winforms MDI客户端区域的实际大小-高度- 14?

wlwcrazw  于 2022-11-17  发布在  其他
关注(0)|答案(1)|浏览(129)

我正在尝试将MDI子窗口置于父窗口工作区的中心。通过反复试验,我发现以下方法有效:
((父级.客户端大小.宽度- 4)-中心子级.宽度)/2,((父级.客户端大小.高度- 14)-中心子级.高度)/2
我计算出宽度减去4就是两边边框的大小,我可以通过在父级中获取MDIClient控件(由于堆栈溢出,我发现了这一点),或者减去SystemInformation.Border3DSize.Width * 2来获得该数字。这对我来说很有意义。
我很难弄清楚为什么要从高度中减去14。假设下边界是2,那么仍然会留下数字12,我无法解释它。(如果上边界也是2,那么仍然会留下10。)我研究了以下内容:

  • 在父控件中获取MDIClient控件不会像获取宽度那样获取精确的高度,而是获取parent.ClientSize.Height -28,这是我通过反复试验得出的差值的两倍。28可能表示下边框(2)+一个顶部边框(2)+菜单条的高度(24),但这并不能解释我发现完美的14。
  • 菜单条高度-正如我上面所说,这是24。
  • SystemInformation中的各种其他窗口元素度量。也许我忽略了一个,但似乎没有什么能解释它。

我当然可以用代码与我的试错数字,但我讨厌不明白。有没有人有任何想法,将解释(总)身高差异14?

vawmfj5a

vawmfj5a1#

似乎没有一个框架函数会为MDIClient给予正确的尺寸,API函数(如GetWindowRect或GetWindowInfo)也不会。从NativeWindow派生以子类化MDIClient窗口,并在遇到wparam==true时查看WM_NCCALCSIZE,在这种情况下,lparam指向将具有正确值的NCCALCSIZE_PARAM结构。

struct NCCALCSIZE_PARAMS
         {
            public RECT rcNewWindow;
            public RECT rcOldWindow;
            public RECT rcClient;
            IntPtr lppos;
         }

相关问题