我有一个类似于Team View软件的远程访问,我希望根据鼠标图标更改鼠标光标(在"控制器"部分,服务器端),#34; Controled&# 34;部分,就像在Team View软件中完成的那样。
我的软件使用的是TPaintBox
,因为我需要制作其他必要的工具TPaintBox
才能正常工作。
TPaintBox
有crDefault
作为默认光标。只有在鼠标位于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;
欢迎所有建议。
答案 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
内的光标是静态的,但与应用程序的其他部分不同,那么这样就可以了: