演示代码如下, 环境D7procedure TForm1.FormCreate(Sender: TObject);
begin
  screen.Cursors[1]:=loadcursorfromfile('50.cur');
  bIn := False;
end;procedure TForm1.pnl1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  icon: Cardinal;
begin
  bIn := True;
  pnl1.Cursor := 1;
end;procedure TForm1.pnl1Exit(Sender: TObject);
begin
  bIn := False;
  pnl1.Cursor := 0;
end;procedure TForm1.pnl1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  bIn := False;
  pnl1.Cursor := 0;
end;
想实现的效果是当在pnl1上按下左键时, 将光标形状自定义, 弹起或离开pnl1区域时恢复.
现在的问题是: 左键按下时光标形状未改变, 右键按下时正常.

解决方案 »

  1.   

    代码试了下
    把弹起的代码注释掉,按下之后弹起的时候才更换光标
    要不用screen.Cursor := 1;
      

  2.   

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      screen.Cursors[1]:=loadcursorfromfile('50.cur');
      bIn := False;
    end;procedure TForm1.pnl1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      icon: Cardinal;
    begin
      bIn := True;
      Cursor := 1;
    end;procedure TForm1.pnl1Exit(Sender: TObject);
    begin
      bIn := False;
      pnl1.Cursor := crDefault;
    end;procedure TForm1.pnl1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      bIn := False;
      Cursor := crDefault;
    end;
    Panel的Cursor可能与Screen.Cursor相等,所以你直接将桌面的光标改成自定义的就行了,
    鼠标离开的时候再恢复就可以了
      

  3.   

    两位说的都有道理, m617105的回答可以将我问题解决.还有就是TPanel的Onexit事件貌似不能触发, 可通过如下代码简单处理:procedure TForm1.pnl1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
      Rc: TRect;
    begin
      Rc := pnl1.ClientRect;
      InflateRect(Rc, -2, -2);
      if not PtInRect(Rc, Point(x,y)) then
      begin
        if bIn then
        begin
          bIn := False;
          Screen.Cursor := 0;
        end;
      end;
    end;
    多谢大家, 结贴.