1

我一直在寻找几个小时,但没有发现任何有用的东西,因为所有其他问题都过于本地化,所以这是我对这个(常见)问题的版本:

我有一个WindowStyle=NoneResizeMode=NoResize的 WPF 窗口(否则我会得到我不想要的调整边框大小),最重要的是AllowsTransparency= False,我必须坚持这个设置。

将ResizeMode更改为CanResize并使用以下 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 ,有没有办法强制窗口的可调整性?

(也许通过SetWindowLongGWL_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 像素值。我不是 100% 确定左/右和上/下具有完全相同的调整大小区域,或者如果您知道我的意思,一个值是否需要为 19/21……这里的 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 回答