A beginner ask a easy question.
我想在form中定义一个区域,在该区域中实现类似于画布的功能:作图形,画线,写文字等等。现在的问题是:我不知道怎样从form中独立出这个区域,该用什么控件和对象呢?

解决方案 »

  1.   

    这个区域你可以使用form的客户区来做,不需要其它的控件了
      

  2.   

    to Drate(鸟窝里的虫):
      请指教,form的客户区是什么?你说的意思是不是不用任何控件,通过form.canvas直接定义好位置就可以了?to Borlandor(五角▲大民):
      我试一试,thanks.
      

  3.   

    sorry,我没有说清楚,不是moveto lineto,是用鼠标画线。
      

  4.   

    从GraphicControl继承即可,只要该控件上继承了Canvas就可以!一般用PaintBox!
      

  5.   

    我用panitbox了,但没找到变换背景颜色的地方。还有请问:怎样实现用鼠标画线,就像画笔一样?
      

  6.   

    直接在FORM的客户区做就行了,不用画什么区域例如:  form1.Canvas.Pen.Color := clRed ;
      form1.Canvas.MoveTo(20,20);
      form1.Canvas.LineTo(80,80);FORM上除了标题栏和边框都属于客户区
      

  7.   

    1. 不能直接变换背景颜色,需要用指定颜色绘制并填充一个与Canvas大小相同的矩形。2. 鼠标画线,简单说来,在第一次按下鼠标的时候记录鼠标位置(线的起点),在第二次按下鼠标的时候再记录鼠标位置(线的终点),然后以这两个参数用MoveTo, LineTo画线。
      

  8.   

    Paint没有什么背景颜色!只有画布(Canvas)背景!Canvas就是对GDI的封装!所有window窗体都是用GDI画出来的!所以不管有没有继承Canvas对象,都可以在上面绘图!改变PaintBox.Canvas.Brush.Color就可改变背景!
      

  9.   

    to ehom:
      这样啊,我试一试
    to PoolD:
      可能大家没理解我的意思,我是指画笔功能。我是这样做的:
    1 使用paintbox
    2 在mousedown event中,设标志为true,记录点坐标(x1,y1);
    3 在mousemove event中,if 标志=true
      记录当前点坐标(x2,y2);
      moveto(x1,y1);
      lineto(x2,y2);
      x1:=x2;y1:=y2;
    4 在mouseup event中,标志设为false.
    实现了画笔功能,但是在窗口最小化或是被其他窗口覆盖,线条就不见了。请问:
    如果想保留线条的话,怎么办?
      

  10.   

    to ehom:
      类似于PaintBox1.Canvas.Brush.Color := clGreen;的语句不好使。
      

  11.   

    Canvas本身是没有保存画面内容的功能的。这可以通过两种途径解决,第一是改用TImage控件,第二是在TPaintBox的OnPaint事件中重绘Canvas的内容。我个人比较倾向于用第二种方法实现。比如你所提到的直线,可以用起点、终点和颜色、线型加以描述,根据这些信息,将绘制过程在OnPaint时重复一遍即可。
      

  12.   

    如果画布上还没画图形,当然就没有所谓的背景!做个实验!
    PaintBox1.Canvas.Brush.Color := clGreen;
    PaintBox1.Canvas.TextOut(0,0,'Test');
    看到效果了吗?我猜想你要实现的效果!
    PaintBox1.Canvas.Brush.Color := clGreen;
    PaintBox1.Canvas.FillRect(PaintBox1.ClientRect);
      

  13.   

    to PoolD:
      我想实现的是画布的功能,如果什么都重绘的话,将会麻烦得一塌糊涂。
    to ehom:
      是的,可以实现,但是为什么我写在form的FormCreate事件中不好使呢?
      

  14.   

    还有,请大家有时间的话看看:有分相送http://expert.csdn.net/Expert/topic/1136/1136093.xml?temp=.9617731
      

  15.   

    yun,有点像深入浅出Canvas画图 ^_^
      

  16.   

    因为OnCreate是创建窗体,在随后重绘后将清除!所以在OnPaint中写代码!或者拦截WM_PAINT消息!
      

  17.   

    to ehom:
      thanks a lot.