代码之家  ›  专栏  ›  技术社区  ›  zig

鼠标向下移动时光标未更改

  •  7
  • zig  · 技术社区  · 7 年前

    procedure TForm1.Panel1MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      Panel1.Cursor := crSizeAll;
    end;
    
    procedure TForm1.Panel1MouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      Panel1.Cursor := crDefault;
    end;
    

    当我单击面板(MouseDown事件)时,光标不会变为 crSizeAll . 我做错了什么?我如何解决这个问题?

    3 回复  |  直到 7 年前
        1
  •  9
  •   Sertac Akyuz    7 年前

    作为迪玛 explained 原因是 Cursor WM_SETCURSOR 只要按下鼠标按钮,就会捕获自鼠标的消息。

    SetCursor 应用程序编程接口。可能的缺点是,光标将保持您设置的状态,直到您释放鼠标按钮,甚至在面板之外。

    procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      SetCursor(Screen.Cursors[crSizeAll]);
    end;
    

    您不需要重置光标,因为默认值将被假定(响应 WM_设置光标 释放鼠标按钮后显示消息)。


    如果希望光标在面板外部恢复,并在再次进入面板时再次设置,可以包括 OnMouseMove 事件处理程序。这是因为鼠标捕捉到鼠标后,即使在面板外部,鼠标消息也会指向面板:

    procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if Mouse.Capture = Panel1.Handle then begin
        if PtInRect(Rect(0, 0, Panel1.Width, Panel1.Height), Point(X, Y)) then
          SetCursor(Screen.Cursors[crSizeAll])
        else
          SetCursor(Screen.Cursors[crDefault])
      end;
    end;
    
        2
  •  9
  •   Josef Å vejk    7 年前

    简单的把戏 用鼠标捕捉输入。一旦你按下鼠标左键(LMB)打开 TPanel 此面板已取消鼠标打印。

    在那之后,你的代码 Panel1.Cursor := crSizeAll; 开始运行。从VCL的来源中可以看出, TControl 发送消息 CM_CURSORCHANGED 设置所需的光标类型。自从 TWinControl 基于 控制 ,它处理此消息并检查是否捕获了鼠标输入。如果不是这样,那么 双控 发送消息 WM_SETCURSOR

    但微软明确表示了这一信息 有一点限制:

    未捕获鼠标输入 .

    ReleaseCapture :

    procedure TForm1.Panel1MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      ReleaseCapture;
      Panel1.Cursor := crSizeAll;
    end;
    

    释放捕获

    重要的
    齐格 证明使用 释放捕获 OnMouseUp 事件,如果鼠标光标超出 TPanel LMB已经发布。

    有用信息:

    1. WM_SETCURSOR message
    2. SetCapture function
    3. GetCapture function
    4. ReleaseCapture function
        3
  •  8
  •   Remy Lebeau    7 年前

    迪玛解释了为什么要改变 Panel1.Cursor

    作为替代方案,您可以更改 Screen.Cursor 相反:

    procedure TForm1.Panel1MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      Screen.Cursor := crSizeAll;
    end;
    
    procedure TForm1.Panel1MouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      Screen.Cursor := crDefault;
    end;