【问题标题】:setted cursor on form wont show up on controls表单上设置的光标不会显示在控件上
【发布时间】:2017-04-07 02:08:06
【问题描述】:

我使用 Delphi xe-8,我使用线程进行查询,我想在我的线程工作时显示一个沙漏光标。

我将光标设置为沙漏,但是当我将鼠标悬停在表单上的控件上时,例如在网格上,光标显示为默认值;只有当我将鼠标悬停在表单本身上时,光标才会改变。我想要做的是在表单和表单上的任何控件上显示一个沙漏光标,而不是应用程序的其余部分。

我尝试将 Screen.Cursor 设置为 crHourGlass,但它适用于整个应用程序,因此即使我将鼠标悬停在另一个表单上,它也是一个沙漏。

可以这样做吗?如果是我该怎么做?

【问题讨论】:

  • 线程没有游标。如果您希望每个控件具有相同的光标,则需要为每个控件设置它。如果你这样做了,请确保你包含一个 try..finally 以确保它们都被挫败。
  • 你需要设置Screen.Cursor
  • @FreeConsulting:不,你没有,发帖人说他们已经尝试过了。
  • 那你们俩都需要阅读dat fine manual。
  • @KenWhite "您需要为每个控件设置它" - 实际上,您不需要。请参阅我刚刚对我的答案所做的更新。

标签: forms delphi grid cursor controls


【解决方案1】:

当鼠标悬停在给定的TWinControl 上时,操作系统会向其发送WM_SETCURSOR 消息,请求其设置屏幕光标图标。 VCL 对该消息的默认处理如下:

  1. 如果Screen.Cursor不是crDefault,那就是使用的光标。

  2. 否则,如果TWinControl在鼠标下面有一个TGraphicControl子,并且它的Cursor不是crDefault,那就是使用的光标。

  3. 否则,如果TWinControl自己的Cursor不是crDefault,那就是使用的游标。

  4. 否则,消息将传递给父窗口。重复步骤 2-3。

因此,按照您的要求,尝试将 Form 的 Cursor 设置为所需的值,并确保 Form 上的所有子控件都将其 Cursor 设置为 crDefault

如果这不是你的选择,或者如果它不起作用,你可以让你的 Form 类覆盖它的虚拟 WndProc() 方法(或使用 message method)来直接处理 WM_SETCURSOR 消息.首先调用inherited处理程序,如果消息的ResultFALSE并且工作线程正在运行,则调用Win32 API SetCursor()函数来设置你想要的光标图标,并将消息的Result设置为@ 987654344@,如:

protected
  procedure WndProc(var Message: TMessage); override;

...

procedure TMyForm.WndProc(var Message: TMessage);
begin
  inherited;
  if (Message.Msg = WM_SETCURSOR) and (Message.Result = 0) and (Thread is Running) then
  begin
    Windows.SetCursor(Screen.Cursors[crHourGlass]);
    Message.Result := 1;
  end;
end;

或者

private
  procedure WMSetCursor(var Message: TMessage); message WM_SETCURSOR;

...

procedure TMyForm.WMSetCursor(var Message: TMessage);
begin
  inherited;
  if (Message.Result = 0) and (Thread is Running) then
  begin
    Windows.SetCursor(Screen.Cursors[crHourGlass]);
    Message.Result := 1;
  end;
end;

这样Screen.Cursor和个别TControl.Cursor属性仍然优先,但是如果光标保持不变(即所有属性都是crDefault)那么您可以将整个Form作为一个整体更改光标, 不影响其他 Form。

【讨论】:

  • 那行不通。子控件将光标更改为 crDefault,它们不继承 Form 光标。正如 Ken 上面所说,您需要将所有子控件设置为您想要的光标。
  • @SoftDeveloper 我已经更新了我的答案。我添加了一个不同的选项 - 覆盖WndProc - 我已经对其进行了测试以确保它确实有效。无需像 Ken 建议的那样将所有子控件上的 Cursor 设置为相同的值。
  • 感谢您的回复,我明白了,但是代码 sn-p 似乎是 Delphi 和 C++ 的奇怪混合,不能只是粘贴到表单中
  • @SoftDeveloper 已修复
猜你喜欢
  • 2016-08-25
  • 1970-01-01
  • 2020-01-26
  • 2013-04-06
  • 2012-09-23
  • 2011-12-19
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多