0

ボーダレスフォームを使用していて、ドラッグできるようにHTCAPTIONを使用してフォームを実装しました。HTCAPTIONのもう1つの利点は、2倍にすると、最小化および最大化できることです。唯一の問題は、ウィンドウが最大化されたときにボタンのアイコンを最大化ボタンから通常モードボタンに変更できるように、イベントをキャッチしたいということです。これを実装する方法についての素晴らしいアイデアはありますか?

保護されたオーバーライドvoidWndProc(refメッセージm){base.WndProc(ref m);

        switch(m.Msg)
        {
            case Global.WM_NCHITTEST:
                Point mouseCursor = PointToClient(Cursor.Position);

                if (mouseCursor.X < borderSize && mouseCursor.Y < borderSize)
                    m.Result = (IntPtr)Global.HTTOPLEFT;
                else if (mouseCursor.X < borderSize && mouseCursor.Y > Height - borderSize)
                    m.Result = (IntPtr)Global.HTBOTTOMLEFT;
                else if (mouseCursor.X < borderSize)
                    m.Result = (IntPtr)Global.HTLEFT;
                else if (mouseCursor.X > Width - borderSize && mouseCursor.Y < borderSize)
                    m.Result = (IntPtr)Global.HTTOPRIGHT;
                else if (mouseCursor.X > Width - borderSize && mouseCursor.Y > Height - borderSize)
                    m.Result = (IntPtr)Global.HTBOTTOMRIGHT;
                else if (mouseCursor.X > Width - borderSize)
                    m.Result = (IntPtr)Global.HTRIGHT;
                else if (mouseCursor.Y < borderSize)
                    m.Result = (IntPtr)Global.HTTOP;
                else if (mouseCursor.Y > Height - borderSize)
                    m.Result = (IntPtr)Global.HTBOTTOM;
                else
                    m.Result = (IntPtr)Global.HTCAPTION;
                break;
        }
    }

これは、キャッチされたイベントに追加したいコードです

        if (WindowState == FormWindowState.Maximized)
        {
            WindowState = FormWindowState.Normal;
            pb_max.Image = GomeeSoft.Properties.Resources.buttonmax;
        }
        else
        {
            Screen screen = Screen.FromRectangle(new Rectangle(Left, Top, Width, Height));
            this.MaximumSize = screen.WorkingArea.Size;
            WindowState = FormWindowState.Maximized;
            pb_max.Image = GomeeSoft.Properties.Resources.buttonreturn;
        }
4

1 に答える 1

1

ダブルクリックすると、WM_SYSCOMMAND メッセージが生成されます。WndProc でも検出できるもの:

    private const int WM_NCHITTEST = 0x84;
    private const int WM_SYSCOMMAND = 0x112;
    private const int SC_MINIMIZE = 0xf020;
    private const int SC_MAXIMIZE = 0xf030;
    private const int SC_RESTORE = 0xf120;

    protected override void WndProc(ref Message m) {
        if (m.Msg == WM_SYSCOMMAND) {
            switch (m.WParam.ToInt32() & 0xfff0) {
                case SC_MINIMIZE: Console.WriteLine("Minimize"); break;
                case SC_MAXIMIZE: Console.WriteLine("Maximize"); break;
                case SC_RESTORE:  Console.WriteLine("Restore");  break;
            }
        }
        base.WndProc(ref m);
        if (m.Msg == WM_NCHITTEST && m.Result == (IntPtr)1) m.Result = (IntPtr)2;
    }
于 2013-01-31T02:09:27.163 に答える