1

私は何時間も検索してきましたが、他のすべての問題があまりにもローカライズされているため、有用なものは何も見つかりませんでした。この(一般的な)問題の私のバージョンは次のとおりです。

WindowStyle=NoneおよびResizeMode=NoResizeのWPFウィンドウがあり(そうしないと、不要なサイズ変更の境界線が表示されます)、最も重要なAllowsTransparency = Falseであり、この設定に固執する必要があります。

ResizeModeCanResizeに変更し、次のMouseDownハンドラーを使用してカスタムサイズ変更グリップを使用する

[DllImport("User32.dll")]
public static extern bool ReleaseCapture();

[DllImport("User32.dll")]
public static extern IntPtr SendMessage(
     IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);

private void OnResizeGripMouseDown(object sender, MouseButtonEventArgs e) {
    ReleaseCapture();
    SendMessage(Window.Handle, WM_NCLBUTTONDOWN, HTBOTTOMRIGHT, 0);
}

ウィンドウのサイズを完全に変更できますが、サイズ変更の境界線が残っています。ResizeMode = NoResizeがありますが、ウィンドウのサイズ変更を強制する方法はありますか?

(たぶん、経由SetWindowLongしてGWL_EXSTYLE?メッセージが必要な場合は、WindowProcこれを処理するためのセットアップがすでにあります。)

4

2 に答える 2

4

別のメッセージを使用して、目的の動作を強制することができました

SendMessage(Handle, WM_SYSCOMMAND, SC_SIZE + direction, 0);

ここで、WM_SYSCOMMANDはデフォルトのWindowsメッセージであり、SC_SIZEは0xF000で定義されたwParamであり、方向はこの列挙型で定義されたヒットテストハンドルの数値です。

public enum SysCommandSize : int {
     SC_SIZE_HTLEFT = 1,
     SC_SIZE_HTRIGHT = 2,
     SC_SIZE_HTTOP = 3,
     SC_SIZE_HTTOPLEFT = 4,
     SC_SIZE_HTTOPRIGHT = 5,
     SC_SIZE_HTBOTTOM = 6,
     SC_SIZE_HTBOTTOMLEFT = 7,
     SC_SIZE_HTBOTTOMRIGHT = 8
}
于 2012-08-22T10:37:00.097 に答える
1

クリスチャン、あなたの解決策は私を正しい道に導いてくれましたが、私のように愚かで怠惰な人のためのコピーペーストコードが欠けています!コメントした部分のコメントを外すと、境界線を除いてウィンドウを移動できます。

    private void Action_LMouseDownAndMove(object sender, MouseEventArgs e)
    {
        Point mousePosition = this.PointToClient(System.Windows.Forms.Cursor.Position);
        const int WM_NCLBUTTONDOWN = 0xA1;
        //const int HT_CAPTION = 0x2;
        if (e.Button == MouseButtons.Left)
        {
            ReleaseCapture();
            if (mousePosition.X < 20)
            {
                if (mousePosition.Y < 20)
                    SendMessage(Handle, WM_NCLBUTTONDOWN, 13, 0);
                else if (mousePosition.Y > this.Size.Height - 20)
                    SendMessage(Handle, WM_NCLBUTTONDOWN, 16, 0);
                else
                    SendMessage(Handle, WM_NCLBUTTONDOWN, 10, 0);
            }
            else if (mousePosition.X > this.Size.Width - 20)
            {
                if (mousePosition.Y < 20)
                    SendMessage(Handle, WM_NCLBUTTONDOWN, 14, 0);
                else if (mousePosition.Y > this.Size.Height - 20)
                    SendMessage(Handle, WM_NCLBUTTONDOWN, 17, 0);
                else
                    SendMessage(Handle, WM_NCLBUTTONDOWN, 11, 0);
            }
            else if (mousePosition.Y < 20)
                SendMessage(Handle, WM_NCLBUTTONDOWN, 12, 0);
            else if (mousePosition.Y > this.Size.Height - 20)
                SendMessage(Handle, WM_NCLBUTTONDOWN, 15, 0);
            //else
            //  SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
        }

好みに応じて20ピクセルの値を変更します。左/右と上/下のサイズ変更領域がまったく同じかどうか、または意味がわかっている場合は1つの値を19/21にする必要があるかどうかは100%わかりません...ここでif/elseツリーにいくつかの削減の可能性があります、 知っている。そして、20の代わりに定数を使用する必要があります。

サイズを変更できるユーザーを表示するためにカーソルを変更するには、次のコードを使用します。これは、単にMouseMoveイベントハンドラーです。

        this.pictureBox.MouseMove += new MouseEventHandler((a, e) =>
        {
            Point h = this.PointToClient(System.Windows.Forms.Cursor.Position);

            if (h.X < 20)
            {
                if (h.Y < 20)
                {
                    pictureBox.Cursor = System.Windows.Forms.Cursors.SizeNWSE;
                }
                else if (h.Y > this.Size.Height - 20)
                {
                    pictureBox.Cursor = System.Windows.Forms.Cursors.SizeNESW;
                }
                else
                {
                    pictureBox.Cursor = System.Windows.Forms.Cursors.SizeWE;
                }
            }
            else if (h.X > this.Size.Width - 20)
            {
                if (h.Y < 20)
                {
                    pictureBox.Cursor = System.Windows.Forms.Cursors.SizeNESW;
                }
                else if (h.Y > this.Size.Height - 20)
                {
                    pictureBox.Cursor = System.Windows.Forms.Cursors.SizeNWSE;
                }
                else
                {
                    pictureBox.Cursor = System.Windows.Forms.Cursors.SizeWE;
                }
            }
            else if (h.Y < 20)
            {
                pictureBox.Cursor = System.Windows.Forms.Cursors.SizeNS;
            }
            else if (h.Y > this.Size.Height - 20)
            {
                pictureBox.Cursor = System.Windows.Forms.Cursors.SizeNS;
            }
            else
            {
                pictureBox.Cursor = System.Windows.Forms.Cursors.Default;
            }
        });
于 2013-11-02T19:44:15.613 に答える