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 によってレンダリングされる場合、追加される境界線は指定されたサイズに対してカウントされます。

これに対抗するために、フォームをロードまたは表示するときに、ウィンドウのサイズを境界線サイズの 2 倍の値に追加できます。(32) をパラメーターとして使用して (32)を使用してWin32 API 関数をP/Invokingすることにより、その境界線のサイズを取得できます。または(33) を使用して高さを取得します。GetSystemMetricsSM_CXSIZEFRAMESM_CYSIZEFRAME

探しているものについては次のとおりです。

[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 に答える