【问题标题】:How change the mouse cursor inside a control?如何更改控件内的鼠标光标?
【发布时间】:2016-09-01 20:37:17
【问题描述】:

我有一个类似于团队视图软件的远程访问,我想根据“受控”部分的鼠标图标更改鼠标光标(在“控制器”部分,换句话说,服务器端),就像在团队视图中所做的那样软件。

我的软件正在使用TPaintBox,因为我需要将其他必需的东西设置为TPaintBox 才能正常工作。

TPaintBox 具有 crDefault 作为默认光标。仅当鼠标位于 TPaintBox 内时,如何才能更改此设置(在“控制器”部分)?

Here 是用于在“受控”部分(客户端)捕获鼠标图标的代码。

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

//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;

欢迎所有建议。

【问题讨论】:

  • 使用 PaintBox 的 OnMouseEnter 和 OnMouseLeave 事件。
  • 你试过的代码有什么问题,怎么会失败?
  • 提出一个关于在客户端和服务器之间发送实时消息的新问题。我希望您同意我已经回答了您如何更改光标的问题。 (所以不允许在一个帖子中问 2 个问题)。
  • 这很奇怪。您正在代码中设置光标属性。您接受的答案也是如此。我想知道你的问题是什么。

标签: delphi


【解决方案1】:

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

//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 中的光标是静态的,但与应用程序的其余部分不同,那么这可以正常工作:

【讨论】:

  • 您无需摆动鼠标。您可以将最后三行替换为PaintBox1.Parent.Perform(WM_SETCURSOR, PaintBox1.Parent.Handle, MakeLParam(HTCLIENT, WM_MOUSEMOVE));
  • @Johan,我想更改光标(在服务器端)只有当客户端说我光标已更改,将实际光标发送到服务器端的lblPoint(TLabel),并根据此@987654330 @ 我可以在服务器端更改实际光标显示在客户端:-)
  • 我听不懂你在说什么。除非你在做 VLC,否则服务器和客户端都有自己的鼠标和光标。如果您谈论的是在客户端和服务器之间发送消息,那就是另一个问题了。
  • @Johan,是的,客户端将实际光标发送到服务器,我希望将服务器的光标更改为等于客户端光标。
  • 于是把服务器的光标改成客户端的光标。哪一部分你不能做。
猜你喜欢
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多