3

我有一些通过带有bsSizeToolWin边框的表单制作的工具面板,我有自定义处理窗口移动和自定义例程,用于将工具面板与主表单的边框(几乎像停靠功能)粘贴/对齐,但是bsSizeToolWin边框样式的问题我的边框的所有角落/边都很大。

是否可以只使一个特定的边界侧变大?(例如,当工具面板粘在主窗体的左边框上时,我只想要面板的右边框相当大,因为面板的顶部和底部坐标根据主窗体的客户区域的高度对齐,左坐标粘在主窗体的右边框上)

4

1 回答 1

4

视觉的角度来看,默认情况下,如果一个窗口有相当大的边框,那么所有的边缘都被绘制成相当大的,否则它们都不是,因为 Win32 API 没有每个边缘边框样式的概念,只有整个窗口边框样式。如果您希望各种边框看起来不同,您可能必须通过直接处理WM_NCCALCSIZEWM_NCPAINT消息来手动自定义绘制边框。

功能的角度来看,阻止用户在特定边缘调整窗口大小是相当容易的。最简单的方法是让面板处理WM_NCHITTEST消息。给面板正常大小的边框(如果需要,可以自定义绘制),然后让它首先将任何接收到WM_NCHITTEST的消息传递给默认处理程序,然后根据需要调整结果。这种方法的好处是操作系统将不允许用户抓取任何被报告为HTBORDER(不可调整大小的边框)的边缘,并且不会有视觉反馈表明边缘是可调整大小的(即使确实如此)。

例如,让我们使用您的 panel-aligned-on-the-left 示例。如果默认处理程序返回HTBOTTOMHTBOTTOMLEFTHTLEFTHTTOPLEFTHTTOPHTBORDER则改为返回。如果默认处理程序返回HTBOTTOMRIGHTor HTTOPRIGHTHTRIGHT则返回。否则返回默认处理程序返回的任何内容。

根据需要调整面板的哪个边缘来调整值。

例如:

type
  TMyPanelForm = class(TForm)
  private
    fWhichSideCanBeResized: TAlign;
    procedure WMNCHitTest(var Message: TMessage); message WM_NCHITTEST;
  end;

procedure TMyPanelForm.WMNCHitTest(var Message: TMessage);
begin
  inherited;
  case fWhichSideCanBeResized of
    alLeft:
    begin
      case Message.Result of
        HTBOTTOM, HTBOTTOMRIGHT, HTRIGHT, HTTOPRIGHT, HTTOP:
          Message.Result := HTBORDER;
        HTBOTTOMLEFT, HTTOPLEFT:
          Message.Result := HTLEFT;
      end;
    end;
    alRight:
    begin
      case Message.Result of
        HTBOTTOM, HTBOTTOMLEFT, HTLEFT, HTTOPLEFT, HTTOP:
          Message.Result := HTBORDER;
        HTBOTTOMRIGHT, HTTOPRIGHT:
          Message.Result := HTRIGHT;
      end;
    end;
    alTop:
    begin
      case Message.Result of
        HTLEFT, HTBOTTOMLEFT, HTBOTTOM, HTBOTTOMRIGHT, HTRIGHT:
          Message.Result := HTBORDER;
        HTTOPLEFT, HTTOPRIGHT:
          Message.Result := HTTOP;
      end;
    end;
    alBottom:
    begin
      case Message.Result of
        HTLEFT, HTTOPLEFT, HTTOP, HTTOPRIGHT, HTRIGHT:
          Message.Result := HTBORDER;
        HTBOTTOMLEFT, HTBOTTOMRIGHT:
          Message.Result := HTBOTTOM;
      end;
    end;
  end;
end;

或者:

procedure TMyPanelForm.WMNCHitTest(var Message: TMessage);
begin
  inherited;
  case Message.Result of
    HTLEFT:
      if fWhichSideCanBeResized <> alLeft then
        Message.Result := HTBORDER;
    HTRIGHT:
      if fWhichSideCanBeResized <> alRight then
        Message.Result := HTBORDER;
    HTTOP:
      if fWhichSideCanBeResized <> alTop then
        Message.Result := HTBORDER;
    HTBOTTOM:
      if fWhichSideCanBeResized <> alBottom then
        Message.Result := HTBORDER;
    HTTOPLEFT:
      case fWhichSideCanBeResized of
        alTop: Message.Result := HTTOP;
        alLeft: Message.Result := HTLEFT;
      else
        Message.Result := HTBORDER;
      end;
    HTBOTTOMLEFT:
      case fWhichSideCanBeResized of
        alBottom: Message.Result := HTBOTTOM;
        alLeft: Message.Result := HTLEFT;
      else
        Message.Result := HTBORDER;
      end;
    HTTOPRIGHT:
      case fWhichSideCanBeResized of
        alTop: Message.Result := HTTOP;
        alRight: Message.Result := HTRIGHT;
      else
        Message.Result := HTBORDER;
      end;
    HTBOTTOMRIGHT:
      case fWhichSideCanBeResized of
        alBottom: Message.Result := HTBOTTOM;
        alRight: Message.Result := HTRIGHT;
      else
        Message.Result := HTBORDER;
      end;
  end;
end;
于 2016-07-08T00:09:59.753 回答