【问题标题】:Prevent Cursor Change When Resizing & Delphi Styles Used调整大小和使用 Delphi 样式时防止光标更改
【发布时间】:2016-02-17 12:09:42
【问题描述】:

我有一个可以水平调整大小但不能垂直调整大小的相当大的表单(我已将 constraints.minwidth 设置为表单的初始宽度。当光标在左侧时,我希望保持光标不会变为调整大小的光标右边框或角; 光标应该只在顶部或底部边框上改变。有一个解决方案可以在没有 VCL 样式的情况下工作:http://codeverge.com/embarcadero.delphi.vcl.using/how-to-hide-resize-mouse-cursor/1071845。但是,除了我使用 VCL 之外,我有相同的要求样式(Luna),当使用样式并且链接中的示例不起作用时,似乎不会触发 WM_NCHITTEST。

如何防止使用VCL样式时光标变为resize光标?

【问题讨论】:

  • 它被解雇了,只是永远不会到达您的处理程序。您将不得不调查样式引擎源并查找它在哪里侦听或挂钩 WM_NCHITTEST

标签: delphi vcl-styles


【解决方案1】:

样式挂钩消息从WndProc 分支到TWinControl。如果样式挂钩报告消息已处理,WndProc 将返回并且不会分派消息。这就是为什么在设置样式时不会触发表单的 WM_NCHITTEST 消息处理程序。

因此,一种选择是覆盖表单的WndProc

type
  TTestForm = class(TForm)
  protected
    procedure WndProc(var Message: TMessage); override;
    ...

procedure TTestForm.WndProc(var Message: TMessage);
begin
  inherited;
  if (Message.Msg = WM_NCHITTEST) and (Message.Result in [HTLEFT, HTRIGHT]) then
    Message.Result := HTBORDER;
end;


另一种选择是使用正在使用的样式挂钩的后代来覆盖消息的处理。

type
  TTestForm = class(TForm)
    ...
  end;

implementation

uses
  themes;   

type
  TTestFormStyleHook = class(TFormStyleHook)
  protected
    procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
  end;

procedure TTestFormStyleHook.WMNCHitTest(var Message: TWMNCHitTest);
begin
  inherited;
  case Message.Result of
    HTLEFT, HTRIGHT: Message.Result := HTBORDER;
    HTTOPLEFT, HTTOPRIGHT: Message.Result := HTTOP;
    HTBOTTOMLEFT, HTBOTTOMRIGHT: Message.Result := HTBOTTOM;
  end;
end;

initialization
  TCustomStyleEngine.RegisterStyleHook(TTestForm, TTestFormStyleHook);

end.

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 2023-03-07
    • 2014-04-02
    • 1970-01-01
    • 2012-04-13
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多