【问题标题】:Force resize of transparent WPF window with custom chrome使用自定义镶边强制调整透明 WPF 窗口的大小
【发布时间】:2012-08-09 04:05:31
【问题描述】:

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

我有一个带有 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 设置来处理这个问题。)

【问题讨论】:

    标签: c# wpf resize window pinvoke


    【解决方案1】:

    我能够通过使用另一条消息来强制执行所需的行为

    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
    }
    

    【讨论】:

      【解决方案2】:

      Christian,您的解决方案让我走上了正确的道路,但是对于像我这样的愚蠢和懒惰的人来说,它缺少复制粘贴代码! 好了,如果您取消注释注释部分,您可以移动窗口,除了边框。

          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;
                  }
              });
      

      【讨论】:

        猜你喜欢
        • 2021-06-18
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        • 2014-11-29
        • 2011-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多