0

我正在使用此代码来隐藏表单的最小化/最大化控件并且只显示边框

protected override System.Windows.Forms.CreateParams CreateParams
{
    get
    {
        var parms = base.CreateParams;

        parms.Style &= ~0x00C00000; // remove WS_CAPTION
        parms.Style |= 0x00040000;  // include WS_SIZEBOX
        return parms;
    }
}

Visual Studio 中的表单如下所示 在此处输入图像描述

运行应用程序后,它看起来像这样 在此处输入图像描述

您可以看到,当我运行应用程序时,与应用程序右侧相比,应用程序左侧的空间更多。我被卡住了,不知道这种行为。

4

2 回答 2

2

发生这种情况的原因是Form.Size定义窗体的宽度和高度的属性包括窗口的边框大小。在表单设计器中,没有定义边框,因此您可以看到整个表单的布局。但是,当窗口由 Windows 呈现时,添加的边框将计入指定的大小。

为了解决这个问题,在加载或显示表单时,您可以将窗口大小添加为边框大小值的两倍。您可以通过P/Invoking GetSystemMetricsWin32 API 函数使用SM_CXSIZEFRAME(32) 作为参数来检索宽度或SM_CYSIZEFRAME(33) 来检索高度来检索该边框大小。

以下是您要查找的内容:

[DllImport("user32.dll")]
private static extern int GetSystemMetrics(int index);

private static int WindowBorderWidth
{
    get { return GetSystemMetrics(32); }
}

private static int WindowBorderHeight
{
    get { return GetSystemMetrics(33); }
}

protected override void OnLoad(EventArgs e)
{
    int increaseWidth = WindowBorderWidth * 2;
    int increaseHeight = WindowBorderHeight * 2;

    this.Size = new Size(
        this.Size.Width + increaseWidth,
        this.Size.Height + increaseHeight
    );
}
于 2013-05-28T17:06:39.077 回答
1

我不能准确地复制这个。第一个可能的问题是这看起来像一个继承的表单,如果基本表单中的控件在底部或右侧锚点打开的情况下设置了锚点,这可能会导致麻烦。它根据基本表单的大小而不是继承的表单来定位控件。通过仅打开派生形式的那些锚来解决此问题。

其次,更可能的问题是您正在与 Aero 中的 appcompat 问题作斗争。粗边框是 Aero 中的一个重要问题,因为应用程序指定了外部窗口大小。但真正关心的是内部窗口大小,客户矩形的大小。如果 Aero 不处理此问题,则窗口最终会导致客户区太小,无法为控件留出足够的空间。它通过谎报窗口大小来做到这一点,偷偷地让它比应用程序要求的更大。然后在您询问尺寸时撒谎,报告比窗口实际尺寸更小的尺寸。

由于非标准窗口样式,您的 CreateParams 覆盖了关闭的轮次。相应地,窗口的客户区会随着边框变宽而变小,默认为 6 像素。

这个谎言会导致许多其他微妙的问题,例如难以对齐窗口。这个问题最终在 .NET 4.5 中得到解决,这是第一个不再需要支持 XP 的 .NET 版本。因此不再需要谎言。它将您的程序的 EXE 文件标记为需要 Vista 或更高版本。这可以消除谎言。

从你的问题中不清楚你想走哪条路。在这种情况下,最好只强制窗口的大小。您可以在表单的 OnLoad() 方法中执行此操作,如下所示:

    protected override void OnLoad(EventArgs e) {
        this.ClientSize = new Size(NoButton.Right + 10, NoButton.Bottom + 10);
        base.OnLoad(e);
    }
于 2013-05-28T17:00:04.073 回答