直接画布上画出来吧。
或者用image

解决方案 »

  1.   

    [size=44px]↖↗↑←→↓↘↙[/size]
      

  2.   

    这种效果也试过了,问题是我的Label放在一个Panel上,当这个Label移动的时候,我的Panel也要一起移动的,其实就是做了一个箭头的效果
      

  3.   

    鼠标会拖动这个label?直接在这个label的canvas上画就得了。
      

  4.   

    这种效果也试过了,问题是我的Label放在一个Panel上,当这个Label移动的时候,我的Panel也要一起移动的,其实就是做了一个箭头的效果
    这样有什么问题么?
      

  5.   

    是的,运行期要支持拖动,现在想了个办法,用SHAPE来表示直线,于在Label里面放特殊字符的Label,就可以达到这种效果了,直接绘图的话,拖动是个麻烦的事情
      

  6.   

    绘图代码写在控件的OnPaint里,如果没有OnPaint就它的WM_PAINT消息中处理,跟拖动没啥冲突啊,怎么麻烦呢
      

  7.   

    如何在WM_PAINT消息中处理绘图?我对消息机制不是太了解,能详细说一上吗?
      

  8.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        lbl1: TLabel;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure LabelWndProc(var m: TMessage); // 给label控件定义一个新的窗口过程
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.FormCreate(Sender: TObject);
    begin
      // 子类化 label 控件,接管其窗口过程
      lbl1.WindowProc := LabelWndProc;
    end;procedure TForm1.LabelWndProc(var m: TMessage);
    var
      cc: TControlCanvas; // 控件画布
    begin
      if m.Msg = WM_PAINT then
      begin
        cc := TControlCanvas.Create;
        cc.Control := lbl1; // cc 即为该控件的canvas    // 用 cc 在这里画你的箭头    cc.Free;
        m.Result := 0; // 返回0表示已处理了该消息
      end;
      lbl1.Dispatch(m); // 消息传递下去
    end;end.
      

  9.   

    如果是Panel上画箭头,这个接管的过程能行吗?因为Panel是没有Canvas的
      

  10.   

    刚刚试了下,好像没效果,因为我是想要在Panel上画箭头,然后这个Panel运行期是可拖动的,然后箭头也跟着动
      

  11.   

    这里错了
       。
        cc.Free;
        m.Result := 0; // 返回0表示已处理了该消息
      end
      else // 加上else
      lbl1.Dispatch(m); // 把WM_PAINT之外的消息传递下去
    end;
      

  12.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        pnl1: TPanel;
        lbl1: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure lbl1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure lbl1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure lbl1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure NewWndProc(var m: TMessage); // 给label控件定义一个新的窗口过程
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }var
      x1, y1: Integer;
      flag: Boolean;procedure TForm1.FormCreate(Sender: TObject);
    begin
      // 子类化 lbl1 控件,接管其窗口过程
      lbl1.WindowProc := NewWndProc;
    end;procedure TForm1.NewWndProc(var m: TMessage);
    var
      cc: TControlCanvas; // 控件画布
    begin
      if m.Msg = WM_PAINT then
      begin
        cc := TControlCanvas.Create;
        cc.Control := lbl1; // cc 即为该控件的canvas    // 用 cc 在这里画你的箭头
        lbl1.AutoSize := False;
        lbl1.Width := cc.TextWidth('假装我是箭头--------->');
        cc.Brush.Style := bsClear;
        cc.TextOut(0, 0, '假装我是箭头--------->');    cc.Free;
        m.Result := 0; // 返回0表示已处理了该消息
      end
      else
        lbl1.Dispatch(m); // 消息传递下去
    end;// 以下是拖动处理procedure TForm1.lbl1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      x1 := x;
      y1 := y;
      flag := True;
    end;procedure TForm1.lbl1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if flag then
      begin
        pnl1.Left := pnl1.Left + x - x1;
        pnl1.Top := pnl1.Top + y - y1;
      end;
    end;procedure TForm1.lbl1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      flag := False;
    end;end.