如何将一个TImage控件的对象变成透明的写一个画点和画线的程序
我把两个Image放在一起表示两个图层
在下面的图层放实际的点和直线
当画直线时,第一个点确定后直线随着鼠标移动
防止把原来的直线和点擦掉我在上面的图层处理直线的画擦
确定第二个点后再在下面的图层画出直线
可是鼠标拖动时一闪一闪的而且确定第二个点后下面的图层就看不见了请问各位高手该怎么解决或者有什么更好的办法处理画直线的问题
最好不要用新控件
在线等待!!

解决方案 »

  1.   

    只要一个TImage控件、一个Tbitmap对象就可以了
    思路:TImage控件,一个Tbitmap对象,
    Tbitmap保存以前的的画图动作的结果
    比如以前你画了一条直线,此直线的起点、终点,颜色等信息用一个记录表示,
    有N个直线(或椭圆、圆、矩形都行,每个都要用一个记录表示)
    在Tbitmap上画出以前的所有操作
    TImage接收正在进行的画图动作
    比如现在你画一条直线LineN,鼠标点下到点起是一个完整的过程,要记录新线的起点、终点的位置,然后鼠标点起的时候,将Tbitmap上画好的图形拷贝到TImage,然后将新线在TImage上画出,就可以了
      

  2.   

    换一个,只对直线解释,其他图形是一样的:
    TImage对象一个Image1,Tbitmap对象两个:分别BackBitmap,TempBitmap
    定义:
    以前画线,从MouseDown-MouseMove-MouseUp整个过程完成
    当前画线,从MouseDown-MouseMove,没有执行MouseUp
    作用:
    Image1:用来接收当前的画线Line,显示你最终执行的画图结果;
    BackBitmap:用来记录 以前画线,随便多少条;
        TempBitmap:当前画线  和 BackBitmap中所有线
    假设当前画线 Line,属性StartPoint,StopPoint(其它属性自己加)
    BackBitmap为空,以前没有画过线
    当鼠标MouseDown,记录鼠标的Position,此时StartPoint=Position;鼠标MouseMove,记录鼠标的Position,此时StopPoint=Position;
    此时:清空TempBitmap,拷贝BackBitmap的图形到TempBitmap,并在TempBitmap画当前线Line
    然后将TempBitmap的图形拷贝到Image1,显示出来鼠标MouseUp,记录鼠标的Position,此时StopPoint=Position;
    此时:直接在在BackBitmap画line,
    然后将BackBitmap的图形拷贝到Image1,显示出来注意:我说的BackBitmap记录以前的图形,并不真的记录,
          实际记录的信息放在记录数组或类似List的东西里面
    比如:现在我定义TLine
    TLine=record
      StartPoint:TPoint;
      StopPoint:TPoint;
      //you can add other propertys,such as color..
    end;
    var
      LineArray:array[1..100] of TLine;
      CurLine:TLine;每次看情况在BackBitmap重新绘制
    -----------
    应用此种方法可以做成与Windows Paint功能类似的软件,还可以对以前你画的图形的任意一条线(或其他椭圆、矩形等)进行编辑
      

  3.   

    谢谢了
    问题我已经解决了
    我把TPen的Mode设置为pmNotXor就可以了我想如果在OnMouseMove里面对Image进行反复重绘可能会造成闪烁