且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何防止在 VB.NET Windows 窗体中垂直调整大小

更新时间:2023-12-06 09:18:34

您必须小心让表单在启动时自行调整大小.有必要适应具有不同视频 DPI 设置或不同系统字体大小的机器所需的缩放.或者更改标题栏高度的用户覆盖.所有这些都在 Load 事件运行时整理出来.因此:

You have to be careful to allow the form to resize itself at startup. It is necessary to accommodate scaling needed on a machine that has a different video DPI setting or a different system font size. Or a user override that changed the height of the title bar. All of this is sorted out by the time the Load event runs. Thus:

protected override void OnLoad(EventArgs e) {
  Screen scr = Screen.FromControl(this);
  this.MinimumSize = new Size(this.MinimumSize.Width, this.Height);
  this.MaximumSize = new Size(scr.WorkingArea.Width, this.Height);
}

接下来您应该做的是修复当用户将光标移动到允许垂直调整窗口大小的窗口边缘时光标的行为.这有点难看;您必须使用 WndProc 捕获 WM_NCHITTEST 消息并更改消息返回值:

The next thing you ought to do is fix the behavior of the cursor when the user moves it on an edge of the window that allows resizing the window vertically. That's a bit ugly; you have to trap the WM_NCHITTEST message with WndProc and change the message return value:

protected override void WndProc(ref Message m) {
  base.WndProc(ref m);
  if (m.Msg == 0x84) {  // Trap WM_NCHITTEST
    switch (m.Result.ToInt32()) {
      case 12: m.Result = (IntPtr)2; break;  // HTTOP to HTCAPTION
      case 13: m.Result = (IntPtr)10; break; // etc..
      case 14: m.Result = (IntPtr)11; break;
      case 15: m.Result = (IntPtr)1; break;
      case 16: m.Result = (IntPtr)10; break;
      case 17: m.Result = (IntPtr)11; break;
    }
  }
}