1

デフォルトでFormBorderStyle=FixedToolWindowを使用して簡単なテストフォームを作成し、マウスを押すとFixedToolWindowとSizableToolWindowを切り替えるボタンを追加しました。

FormBorderStyleをこれら2つの間で切り替えると、アプリケーションに多くの問題を引き起こす奇妙な効果が生じるようです。問題は、ウィンドウのサイズが変更されているように見えて、それができないことです。境界線を変更したいのですが、フォームのサイズを同じに保つ必要があります。

たとえば、ボタンコードは次のとおりです。

private void button1_Click(object sender, System.EventArgs e) {
    if(FormBorderStyle == FormBorderStyle.FixedToolWindow) {
        System.Diagnostics.Debug.WriteLine("SWITCHING: FIXED -> SIZABLE");
        FormBorderStyle = FormBorderStyle.SizableToolWindow;
    } else {
        System.Diagnostics.Debug.WriteLine("SWITCHING: SIZABLE -> FIXED");
        FormBorderStyle = FormBorderStyle.FixedToolWindow;
    }
}

そしてデバッグするために私はこれを使用します:

private void Settings_SizeChanged(object sender, System.EventArgs e) {
    System.Diagnostics.Debug.WriteLine(this.Size);
}

そして、スイッチボタンを押したときの出力は次のとおりです。

SWITCHING: FIXED -> SIZABLE
{Width=373, Height=169}
{Width=383, Height=179}
SWITCHING: SIZABLE -> FIXED
{Width=383, Height=179}
{Width=373, Height=169}

この動作を修正するにはどうすればよいですか?そして、「修正」とは、可能であればこれが起こらないようにすることを意味します。フォームのサイズを指定して、境界線のスタイルに関係なく、その状態を維持できるようにしたいと考えています。

また、Formクラスをサブクラス化することによる解決策は、このようなメソッドでこの問題を解決するためのアイデアとして誰かがいる場合に備えて、私にとって完璧な解決策になります。

編集:
私は問題を示すために小さなビデオを作りました。最初のテストは、フォームのサイズが実際には(視覚的に)変更されず、フォームの場所のみが少し変更されることを示しています。ただし、デバッグ出力でわかるように、Sizeプロパティの値は変更されます。デバッグ出力に表示される2番目のテストでは、フォームのサイズプロパティ値が変更され、ウィンドウサイズ自体も変更されます。

こちらをご覧ください:
http ://screencast.com/t/0vT1vCoyx2u

4

4 に答える 4

2

あなたの問題は、サイズではなく場所の変更にあります。このコードは、ビデオで見られる問題を解決します。

        private void Form1_DoubleClick(object sender, EventArgs e)
        {
            Point _location = this.PointToScreen(this.ClientRectangle.Location);
            if (this.FormBorderStyle == FormBorderStyle.SizableToolWindow)
            {
                this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
            }
            else
            {
                this.FormBorderStyle = FormBorderStyle.SizableToolWindow;
            }
            Point _newloc = this.PointToScreen(this.ClientRectangle.Location);
            Size _diff = new Size(_newloc) - new Size(_location);
            this.Location -= _diff;
        }

これらの 2 つの境界線スタイルを切り替えるときにレンダリングされたフォームが移動する問題は、DWM のバグのようです。

于 2009-05-13T21:39:46.013 に答える
1

境界線のサイズが変更されている間、Windowsフォームがクライアントのサイズ(つまり内部領域)を同じに保っているのではないかと思います。これは、ウィンドウが配置したコンテンツに正しくフィットすることを保証するため、一般的には良いことです。

同じ外形寸法を維持したい場合は、境界線のタイプを変更する前にサイズを変数に保存してから、元に戻すことで回避できます。ただし、おそらくわずかにちらつきます。

于 2009-05-13T01:41:15.080 に答える
0

これは私にとってはうまくいきました:

    private Size _size;
    private void Form1_DoubleClick(object sender, EventArgs e)
    {
        _size = this.Size;
        if (this.FormBorderStyle == FormBorderStyle.SizableToolWindow)
        {
            this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
        }
        else
        {
            this.FormBorderStyle = FormBorderStyle.SizableToolWindow;
        }
        this.Size = _size;
    }
于 2009-05-13T02:12:52.730 に答える
0

私はこれと同じ問題を抱えていました。FormBorderStyle を設定するとクライアントのサイズが変わりますが、すぐには clientrectangle プロパティに入れられないようです。上記のコードはほとんど機能しましたが、サイズを保存するだけでなく、クライアントサイズを保存してください。もちろん、上記の例では、おそらく "this" は clientsize への参照でした - 私にはわかりませんでした。とにかく購入してください、これは私にとってはうまくいきました:

_frmFilter.Height = 300 Dim _size As Size = .ClientSize _frmFilter.FormBorderStyle = FormBorderStyle.FixedToolWindow _frmFilter.ClientSize = _size

于 2011-01-17T19:40:56.617 に答える