我在 Panel 继承了 Canvas ,用一个线程不停地绘图,当鼠标在窗口或其它控件上面随便移动一下 这个 panel 就会闪烁,鼠标在窗口外就没问题,请问为什么?谢谢。主窗口 与 panel
DoubleBuffered:=True;也没效果

解决方案 »

  1.   

    什么叫继承了canvas?是某控件继承自panel然后重写canvas属性,还是你的panel继承自canvaa?你这样说让人迷惑。。
      

  2.   

      TWealshPnl = class(TPanel)
      private
        FOnMouseEnter: TNotifyEvent;
        FOnMouseLeave: TNotifyEvent;
        FPaint:TNotifyEvent;
        procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
        procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
      protected
        procedure Paint;override;
      public
        TmpSpBmp:TBitmap;
        procedure CBShowSp(pData:Pointer;pSize:Integer);
        property Canvas;
        procedure ResizeBmp1(SrcBM, DstBM: TBitmap; Nwide, Nheight: integer);
      published
        property OnMouseEnter:TNotifyEvent  read FOnMouseEnter write FOnMouseEnter;
        property OnMouseLeave:TNotifyEvent  read FOnMouseLeave write FOnMouseLeave;
        property OnPaint:TNotifyEvent read FPaint write FPaint;
      end;
    procedure TWealshPnl.CBShowSp(pData:Pointer;pSize:Integer);
    var
      B:TBitmap;
    begin
      if not Assigned(TmpSpBmp) then
        begin
          TmpSpBmp:=TBitmap.Create;
          DoubleBuffered:=True;
        end;
      TmpSpBmp.Canvas.Lock;
      Canvas.Lock;
      TmpSpBmp.Handle := HBitmap(pData^);
      B:=TBitmap.Create;
      ResizeBmp1(TmpSpBmp,B,Width-6,Height-6);
      Canvas.Draw(3,3,B);
      B.Free;
    end;
      

  3.   

      TWealshPnl = class(TPanel)
      private
        FOnMouseEnter: TNotifyEvent;
        FOnMouseLeave: TNotifyEvent;
        FPaint:TNotifyEvent;
        procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
        procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
      protected
        procedure Paint;override;
      public
        TmpSpBmp:TBitmap;
        procedure CBShowSp(pData:Pointer;pSize:Integer);
        property Canvas;
        procedure ResizeBmp1(SrcBM, DstBM: TBitmap; Nwide, Nheight: integer);
      published
        property OnMouseEnter:TNotifyEvent  read FOnMouseEnter write FOnMouseEnter;
        property OnMouseLeave:TNotifyEvent  read FOnMouseLeave write FOnMouseLeave;
        property OnPaint:TNotifyEvent read FPaint write FPaint;
      end;
    procedure TWealshPnl.CBShowSp(pData:Pointer;pSize:Integer);
    var
      B:TBitmap;
    begin
      if not Assigned(TmpSpBmp) then
        begin
          TmpSpBmp:=TBitmap.Create;
          DoubleBuffered:=True;
        end;
      TmpSpBmp.Canvas.Lock;
      Canvas.Lock;
      TmpSpBmp.Handle := HBitmap(pData^);
      B:=TBitmap.Create;
      ResizeBmp1(TmpSpBmp,B,Width-6,Height-6);
      Canvas.Draw(3,3,B);
      B.Free;
    end;
      

  4.   

    使用双缓存,每次重绘时用缓存里的图形,而不是直接在Draw里绘制