0

背景画像を中央に配置したMDIフォームがあります。
ユーザーがフォームのサイズまたは状態を変更するたびに、画像はまったく更新されません。それは古い場所に残り(もはや中央に配置されていません)、フォームを小さくしすぎると失われます。

この状況を正しく処理するにはどうすればよいですか?
フォームのサイズと状態に関連するすべてのイベントハンドラーで本当に「this.Refresh()」を呼び出す必要がありますか?

アプリケーションは、Windows.Formsを使用した.net 3.5SP1 C#で実現されます。

4

4 に答える 4

2

me.refreshそのすべてを行うことも、MDI のresizeイベントに a を入れることもできます。

于 2010-01-14T14:30:31.157 に答える
2

残念ながら、これを行うための超迅速な方法はないようですが、以下は私の解決策であり、少なくとも偶然に依存していないようです.

mdi コンストラクターで、サイズ変更を処理します。

this.ResizeEnd += delegate { this.Refresh(); };

そして、最大化/復元イベントを処理するためのこのオーバーライド

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == Win32.WM_SYSCOMMAND)
        {
            int test = m.WParam.ToInt32() & 0xFFF0;
            switch (test)
            {
                case Win32.SC_MAXIMIZE:
                case Win32.SC_RESTORE:
                    this.Invalidate();  // used to keep background image centered
                    break;
            }
        }
        base.WndProc(ref m);
    }

定数値は次のように定義されます。

    public const int WM_SYSCOMMAND =                    0x0112;
    //wparam for WM_SYSCOMMAND should be one of these after masking with 0xFFF0:
    public const int SC_RESTORE =                       0xF120;
    public const int SC_MINIMIZE =                      0xF020;
    public const int SC_MAXIMIZE =                      0xF030;
于 2009-12-23T15:09:55.987 に答える
0

MDI フォームの Resize イベントで PositionContainersToParentMiddle メソッドを呼び出します。私はそれをテストしていませんが、動作するはずです。サイズ変更ごとに画像の場所の変更を停止するには、Resize イベントに条件を設定する必要がある場合があります。

   private void YourMDI_Resize(object sender, EventArgs e)
    {
        PositionContainersToParentMiddle();
    }

    private void PositionContainersToParentMiddle()
    {
        int iInitX = (ParentOfImage.Size.Width - YourImage.Size.Width) / 2;
        int iInitY = ( ParentOfImage.Location.Y + YourImage.Size.Height ) / 2;
        YourImage.Location = new Point( iInitX, iInitY ) ;

    }
于 2009-09-14T11:52:12.543 に答える
0
Private Sub YourMDIFormName_Resize(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Resize
    Me.BackgroundImage = My.Resources.YourBackgroundImageName
    Me.Refresh()
 End Sub
于 2013-07-19T07:35:06.267 に答える