如何更改控件内的鼠标光标?

时间:2016-09-01 20:37:17

标签: delphi

我有一个类似于Team View软件的远程访问,我希望根据鼠标图标更改鼠标光标(在"控制器"部分,服务器端),#34; Controled&# 34;部分,就像在Team View软件中完成的那样。

我的软件使用的是TPaintBox,因为我需要制作其他必要的工具TPaintBox才能正常工作。

TPaintBoxcrDefault作为默认光标。只有在鼠标位于TPaintBox内时,我该如何更改(在#34; Controler"部分)?

Here是用于鼠标捕获图标的代码,在#34; Controled"部分(客户端)。

这是我的代码,直到现在尝试更改鼠标的图标在" Controler"部分(服务器端):

//pbRec is name of TPaintBox used

procedure TForm2.pbRecMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if Form2.lblPoint.Caption = 'OCR_NORMAL' then
    pbRec.Cursor := crDefault
  else if Form2.lblPoint.Caption = 'OCR_HAND' then
    pbRec.Cursor := crHandPoint
  else if Form2.lblPoint.Caption = 'OCR_IBEAM' then
    pbRec.Cursor := crIBeam;
end;

欢迎所有建议。

1 个答案:

答案 0 :(得分:5)

如果您想在代码中更改光标,则以下内容将起作用。

//Context: Timer.Interval = 50; :-)

procedure TForm57.Timer1Timer(Sender: TObject);
var
  p: TPoint;
begin
  if Ord(PaintBox1.Cursor) < Ord(crSizeAll) then PaintBox1.Cursor:= crArrow
  else PaintBox1.Cursor:= Pred(PaintBox1.Cursor);
  //Force Windows to change the cursor by sending a WM_SETCURSOR message.
  PaintBox1.Parent.Perform(WM_SETCURSOR, PaintBox1.Parent.Handle, MakeLParam(HTCLIENT, WM_MOUSEMOVE)); 
  (** //if you're viewing using a slow remote connection you make need to do this: 
  //Wiggle the mouse to force cursor change.
  GetCursorPos(p);
  SetCursorPos(p.x-1, p.y);
  Sleep(100); //needed on slow remote connection.
  SetCursorPos(p.x, p.y);  (**)
end;

如果您每次鼠标进入绘图箱时都要根据某些上下文更改光标,那么在MouseMove事件中执行此操作相当浪费。
改为在OnMouseEnter事件中更改它。

procedure TForm57.PaintBox1MouseEnter(Sender: TObject);
begin
  if .... then PaintBox1.Cursor:= crIBeam
  else if .....
  PaintBox1.Parent.Perform(WM_SETCURSOR, PaintBox1.Parent.Handle, MakeLParam(HTCLIENT, WM_MOUSEMOVE));
end;

如果您使用远程连接,则客户端远程端可以缓存光标。在这种情况下,您可能需要将其向一侧摆动Sleep(100)并将其摆回以使客户端软件检测到鼠标移动并强制刷新游标。

如果你只是希望PaintBox内的光标是静态的,但与应用程序的其他部分不同,那么这样就可以了:

enter image description here