请教各位高手
如何进行层次性作图?用layer行不行?
比如一个模块用矩形来表示  但是这个模块还包含许多子模块 也用矩形来表示
但是不能把这个模块跟他的子模块在同一个界面上显示出来。 所以就有个父模块跟子模块之间就有个层次性
想把不同层次的模块在不同的layer上显示 或者说大家有没有一个更好的方法来实现这个作图功能?谢谢各位

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, ToolWin;type
       TShape=(vLine,vRectangle,vRoundRect,vRound,vEllipse);  TForm1 = class(TForm)
        ToolBar1: TToolBar;
        T_line: TToolButton;
        T_ellipse: TToolButton;
        T_rectangle: TToolButton;
        T_roundrect: TToolButton;
        T_circle: TToolButton;
        T_text: TToolButton;
        StatusBar1: TStatusBar;
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure T_lineClick(Sender: TObject);
        procedure T_rectangleClick(Sender: TObject);
        procedure T_roundrectClick(Sender: TObject);
        procedure T_circleClick(Sender: TObject);
        procedure T_ellipseClick(Sender: TObject);
        procedure T_textClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      Start_cur:TPoint;  //画图起点
      Pre_cur:TPoint;  //上一个点
      Can_Draw:Boolean;  //画图开关
      Shape:TShape;  //画图形状implementation{$R *.dfm}procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
     Can_Draw:=True;  //打开画图开关
     Start_cur.X:=X;  //记录起始点
     Start_cur.Y:=Y;
     Pre_cur.X:=X;
     Pre_cur.Y:=Y;
    end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
     Can_Draw:=False;
    end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
     Radius:Integer;
    begin
     if Can_Draw then
      begin
       Canvas.Pen.Mode:=pmNotXor;  //pmXor的互补色
        case Shape of
         vLine: begin
                  Canvas.MoveTo(Start_cur.X,Start_cur.Y);
                  Canvas.LineTo(Pre_cur.X,Pre_cur.Y);
                 end;
          vRectangle:
            Canvas.Rectangle(Start_cur.X,Start_cur.Y,Pre_cur.X,Pre_cur.Y);
          vRoundRect:
            Canvas.RoundRect(Start_cur.X,Start_cur.Y,Pre_cur.X,Pre_cur.Y,15,15);
          vRound: begin
                    Radius:=Round(Sqrt(Sqr(abs(Pre_cur.X-Start_cur.X))+
                                  Sqr(abs(Pre_cur.Y-Start_cur.Y))));
                    Canvas.Ellipse(Start_cur.X-Radius,Start_cur.Y-Radius,
                                   Start_cur.X+Radius,Start_cur.Y+Radius);
                   end;
          vEllipse:
            Canvas.Ellipse(Start_cur.X,Start_cur.Y,Pre_cur.X,Pre_cur.Y);
        end;
        Canvas.Pen.Mode:=pmCopy;  //画新的图形
        case Shape of
          vLine: begin  //直线
                   Canvas.MoveTo(Start_cur.X,Start_cur.Y);
                   Canvas.LineTo(X,Y);
                   StatusBar1.SimpleText:='直线';
                  end;
          vRectangle: begin  //矩形
                       Canvas.Rectangle(Start_cur.X,Start_cur.Y,X,Y);
                       StatusBar1.SimpleText:='矩形';
                      end;
          vRoundRect: begin  //圆角矩形
                       Canvas.RoundRect(Start_cur.X,Start_cur.Y,X,Y,10,10);
                       StatusBar1.SimpleText:='圆角矩形';
                      end;
          vRound: begin //圆
                    Radius:=Round(Sqrt(Sqr(abs(X-Start_cur.X))+
                                  Sqr(abs(Y-Start_cur.Y))));
                    Canvas.Ellipse(Start_cur.X-Radius,Start_cur.Y-Radius,
                                  Start_cur.X+Radius,Start_cur.Y+Radius);
                    StatusBar1.SimpleText:='圆形';
                   end;
          vEllipse:  begin  //椭圆
                      Canvas.Ellipse(Start_cur.X,Start_cur.Y,X,Y);
                      StatusBar1.SimpleText:='椭圆';
                     end;
        end;
        Pre_cur.X:=X;
        Pre_cur.Y:=Y;
       end;
    end;//单击【直线】按钮的响应事件代码。
    procedure TForm1.T_lineClick(Sender: TObject);
    begin
     Shape:=vLine;
    end;//单击【矩形】按钮的响应事件代码。
    procedure TForm1.T_rectangleClick(Sender: TObject);
    begin
     Shape:=vRectangle;
    end;//单击【圆角矩形】按钮的响应事件代码。
    procedure TForm1.T_roundrectClick(Sender: TObject);
    begin
     Shape:=vRoundRect;
    end;//单击【圆】按钮的响应事件代码。
    procedure TForm1.T_circleClick(Sender: TObject);
    begin
     Shape:=vRound;
    end;//单击【椭圆】按钮的响应事件代码。
    procedure TForm1.T_ellipseClick(Sender: TObject);
    begin
     Shape:=vEllipse;
    end;//单击【文字】按钮的响应事件代码。
    procedure TForm1.T_textClick(Sender: TObject);
    begin
     Canvas.TextOut(Start_cur.X,Start_cur.Y,InputBox('请输入字符串','字符串',''));
     //输出文字
     StatusBar1.SimpleText:='文字';
    end;end.
    看看这个对你是否有用
      

  2.   

    麻烦WANGXUELLD能不能把源代码发到