2016-09-01 2 views
2

팀 뷰 소프트웨어와 비슷한 원격 액세스 권한이 있으며 Team View 소프트웨어에서와 같이 "제어 된"부분의 마우스 아이콘에 따라 마우스 커서 ("컨트롤러"부분, 서버 쪽)를 변경하고 싶습니다. .컨트롤 안에서 마우스 커서를 어떻게 바꿉니 까?

필자의 소프트웨어는 TPaintBox을 필요로하므로 다른 사람들이 필요하다고 생각하므로 TPaintBox을 사용하고 있습니다.

TPaintBox은 기본 커서로 crDefault입니다. 마우스가 TPaintBox 안에있는 동안에 만 어떻게 ("Controler"부분에서) 이것을 바꿀 수 있습니까?

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; 

모든 제안을 환영합니다 :

그리고 여기는 "CONTROLER"부분에 마우스 지금 노력하고 변경 아이콘 (서버 측)까지 내 코드입니다.

+0

은 그림 물감의 OnMouseEnter 및 OnMouseLeave 이벤트를 사용합니다. –

+0

시도한 코드에 어떤 문제가 있습니까? 어떻게 실패합니까? –

+0

클라이언트와 서버간에 실시간 메시지를 보내는 것에 대해 새로운 질문을하십시오. 커서 변경 방법에 대한 귀하의 질문에 답변 해 주셨으면합니다. (SO는 단일 게시물에서 2 개의 질문을 허용하지 않습니다). – Johan

답변

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

+2

마우스를 움직일 필요가 없습니다. 마지막 세 줄을'PaintBox1.Parent.Perform (WM_SETCURSOR, PaintBox1.Parent.Handle, MakeLParam (HTCLIENT, WM_MOUSEMOVE));로 바꿀 수 있습니다. –

+0

@Johan, 클라이언트 사이드가 말할 때만 (서버 측에서) 커서 변경을 원합니다. 저 커서가 실제 커서를 서버 측의 lblPoint (TLabel)로 보내고이 TLabel에 따라 클라이언트 측에서 실제 커서가 보이도록 서버 측에서 변경할 수 있습니다 :-) –

+0

나는 이해할 수 없다. 니가 말하는거야. VLC를하지 않는 한 서버와 클라이언트는 각각 마우스와 커서를 가지고 있습니다. 다른 질문 인 클라이언트와 서버간에 메시지를 보내는 것에 대해 이야기하는 경우 – Johan

관련 문제