gpt4 book ai didi

delphi - 如何停止Screen.Cursor影响窗体上的所有控件?

转载 作者:行者123 更新时间:2023-12-03 15:24:33 25 4
gpt4 key购买 nike

我会尽力简化我的问题。例如,如果您放下 2 个 TSpeedButton 并执行以下操作:

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
SpeedButton2.Cursor := crHandPoint; // note I'm setting other cursor than crDefault
end;

SpeedButton2.Cursor 仍显示设置为 crHourGlassScreen.Cursor
我研究了 TScreen.SetCursor 代码,并意识到它为整个表单设置了光标。
我的问题:是否可以在整个表单中使用 Screen.Cursor ,但不会影响我想要设置其他光标的某些控件。

TButton 也会发生同样的情况。如果我可以在 Screen.Cursor 设置为 crHourGlass 时以某种方式控制它的光标,我不介意将 SpeedButton 放在窗口控件上。

谢谢。

最佳答案

这是故意行为,如 documentation 中所述。对于TScreen.Cursor:

... When Cursor is crDefault, the individual objects determine the cursor image. Assigning any other value sets the mouse cursor image for all windows belonging to the application. The global mouse cursor image remains in effect until the screen's Cursor property is changed back to crDefault. ..


窗口控件在 TWinControl.WMSetCursor 过程(WM_SETCURSOR 消息的处理程序)中处理其光标,如果屏幕光标不是 crDefault ,则在该过程中显式设置屏幕光标> 并忽略自己的光标。

因此,要更改行为,您可以处理提到的消息。对于 TButton 插入器,示例如下:

procedure TButton.WMSetCursor(var Message: TWMSetCursor);
begin
if (Cursor <> crDefault) and (Message.HitTest = HTCLIENT) then begin
Message.Result := 1;
Windows.SetCursor(Screen.Cursors[Cursor]);
end else
inherited;
end;



图形控件的光标由其父级TWinControl 处理。因此,要更改速度按钮的行为,您仍然需要在其父级上处理相同的消息。这可能不切实际,因为事先可能不知道父类。

不过,一个非常非通用的实现,例如直接放置在表单上的图形控件,可能如下所示:

procedure TForm1.WMSetCursor(var Message: TWMSetCursor);
var
SmPt: TSmallPoint;
Control: TControl;
begin
DWORD(SmPt) := GetMessagePos;
Control := ControlAtPos(ScreenToClient(SmallPointToPoint(SmPt)), True);
if Assigned(Control) and Boolean(Control.Tag) then begin
Message.Result := 1;
Windows.SetCursor(Screen.Cursors[Control.Cursor])
end else
inherited;
end;

上面的示例要求图形控件具有非零标记值。例如:

procedure TForm1.Button1Click(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
SpeedButton1.Cursor := crHandPoint;
SpeedButton1.Tag := 1;
end;

关于delphi - 如何停止Screen.Cursor影响窗体上的所有控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59180526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com