我实际上在浏览SO时发现了解决方案。
,我忘了成分通常有自己的Cursor属性,这是他们如何设定正确的鼠标光标的类型时,指针在他们(即按钮的行为)
通过重写的MouseMove改变光标crHandPoint
如果它超过了超链接单元格,并且存储旧的游标属性以恢复为不超过超链接似乎可以正常工作(并且独立于在长时间运行的代码中设置的screen.cursor)。我需要完成代码以确认它能正常工作,所以我现在不会回答这个问题,直到我确认所有事情都可以按照我的预期工作。
编辑:添加一些代码。我决定使用一个拦截器类而不是子类化网格,并且必须注册控件 - 我只会在一个应用程序的一两个地方使用它,并且无需设置其他人的机器。
TdxMasterView = class(dxMasterView.TdxMasterView)
private
FDefaultCursor: TCursor;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
public
constructor Create(AOwner: TComponent); override;
end;
constructor TdxMasterView.Create(AOwner: TComponent);
begin
inherited create(AOwner);
FDefaultCursor := self.Cursor;
end;
procedure TdxMasterView.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
lvHitTestCode: TdxMasterViewHitTestCode;
lvNode : TdxMasterViewNode;
lvColumn: TdxMasterViewColumn;
lvRowIndex, lvColIndex: integer;
begin
inherited;
lvHitTestCode := self.GetHitTestInfo(Point(X,Y),
lvNode,
lvColumn,
lvRowIndex,
lvColIndex);
if (lvHitTestCode = htContent) and (lvColumn is TMasterViewClickableColumn) then
begin
TMasterViewClickableColumn(lvColumn).onClickContentCell(lvNode);
end;
end;
procedure TdxMasterView.MouseMove(Shift: TShiftState; X, Y: Integer);
var
lvHitTestCode: TdxMasterViewHitTestCode;
lvNode : TdxMasterViewNode;
lvColumn: TdxMasterViewColumn;
lvRowIndex, lvColIndex: integer;
begin
inherited;
lvHitTestCode := self.GetHitTestInfo(Point(X,Y),
lvNode,
lvColumn,
lvRowIndex,
lvColIndex);
if (lvHitTestCode = htContent) and (lvColumn is TMasterViewClickableColumn) then
begin
self.cursor := TMasterViewClickableColumn(lvColumn).cursorOnMouseOver;
end
else
begin
self.cursor := self.FDefaultCursor;
end;
end;
手柄['WM_SETCURSOR'(https://msdn.microsoft.com/en-us/library/windows/desktop/ms648382.aspx) –
也许这将帮助:https://开头堆栈溢出。com/questions/19257237/reset-cursor-in-wm-setcursor-handler-properly –
或者这个https://stackoverflow.com/q/19570880/8041231 – Victoria