Delphi TCustomControl光标刷新

Delphi TCustomControl光标刷新,delphi,Delphi,我有一个TCustomControl,缩放就是图像。放大控件时,光标设置为crZoomIn(+),缩小控件时,光标设置为crZoomOut(-) 测试时,控件光标设置正确,但直到鼠标移出控件然后回到控件上,光标才会刷新 如何刷新或更新光标而不必将鼠标移出控件,然后再移回到控件上 {编辑] 更改光标的代码为: procedure TBitmapEditor.ZoomIn; begin if Magnification = 1 then Magnification := 2 else

我有一个TCustomControl,缩放就是图像。放大控件时,光标设置为crZoomIn(+),缩小控件时,光标设置为crZoomOut(-)

测试时,控件光标设置正确,但直到鼠标移出控件然后回到控件上,光标才会刷新

如何刷新或更新光标而不必将鼠标移出控件,然后再移回到控件上

{编辑]

更改光标的代码为:

procedure TBitmapEditor.ZoomIn;
begin
  if Magnification = 1 then
    Magnification := 2
  else if Magnification < 32 then
    Magnification := Magnification + 2;
  Cursor := crZoomIn;
  Perform( CM_CURSORCHANGED, 0, 0 );
end;

procedure TBitmapEditor.ZoomOut;
begin
  if Magnification = 2 then
    Magnification := 1
  else if Magnification > 1 then
    Magnification := Magnification - 2;
  Cursor := crZoomOut;
  Perform( CM_CURSORCHANGED, 0, 0 );
end;
程序tbitmapreditor.ZoomIn;
开始
如果放大率=1,则
放大倍数:=2
否则,如果放大率小于32,则
放大倍数:=放大倍数+2;
光标:=crZoomIn;
执行(CM_光标更改,0,0);
终止
程序tbitmapreditor.ZoomOut;
开始
如果放大率=2,则
放大倍数:=1
否则,如果放大率>1,则
放大倍数:=放大倍数-2;
光标:=crZoomOut;
执行(CM_光标更改,0,0);
终止

执行(CM_CURSORCHANGED,0,0);不更改光标,但光标设置正确,我认为,因为当我按说明移动鼠标时,光标会正确更改。

我无法再现此情况。可能是一些最简单的代码?您是否尝试过执行(CM_CURSORCHANGED,0,0)?我将其更改为:Cursor:=crZoomOut;Windows.SetCursor(Screen.Cursors[crZoomOut]);Perform(CM_CURSORCHANGED,0,0);现在它可以正常工作了。谢谢Andreas…@Bill:但是
SetCursor
会影响你的整个应用程序,不仅仅是自定义控件。我想这和
Screen.Cursor
是一样的。缩放时你还做什么?SetCursor,就像在控件中来回移动光标一样,会通过Windows API。我可能是这样毫无疑问,但当你使用这些工具时,光标确实会发生变化,这让我相信你没有给你的应用程序一个机会来处理windows消息以重新绘制光标。你可以通过在缩放代码中粘贴
应用程序。processmessages
来确认这一点,尽管我不建议将其作为最终解决方案。我不能复制这个。可能是一些最小的代码?您是否尝试过执行(CM_CURSORCHANGED,0,0)?我将其更改为:Cursor:=crZoomOut;Windows.SetCursor(Screen.Cursors[crZoomOut]);执行(CM_CURSORCHANGED,0,0);现在它可以正常工作了。谢谢Andreas…@Bill:但是
SetCursor
会影响你的整个应用程序,不仅仅是自定义控件。我想这和
Screen.Cursor
是一样的。缩放时你还做什么?SetCursor,就像在控件中来回移动光标一样,会通过Windows API。我可能是这样毫无疑问,但当你使用这些工具时,光标确实会发生变化,这让我相信你没有给你的应用程序机会处理windows消息以重新绘制光标。你可以通过在缩放代码中粘贴
应用程序.processmessages
来确认这一点,尽管我不建议将其作为最终解决方案。