Panel控件如何设置透明色? 回复内容

1 楼leis_777()回复于 2004-11-03 19:55:46

学习学习Top

2 楼leis_777()回复于 2004-11-03 19:56:15

关注Top

3 楼bobdylan(风)回复于 2004-11-05 17:56:38

没人理呀……!算了!自己搞定Top

4 楼luke5678()回复于 2004-11-07 22:33:50

//透明的Panel  
   
   
  unit   Glass;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,  
      ExtCtrls;  
   
  type  
      TGlassStyle   =   (  
          gsBlackness,   gsDstInvert,   gsMergeCopy,   gsMergePaint,   gsNotSrcCopy,  
          gsNotSrcErase,   gsPatCopy,   gsPatInvert,   gsPatPaint,   gsSrcAnd,  
          gsSrcCopy,   gsSrcErase,   gsSrcInvert,   gsSrcPaint,   gsWhiteness);  
   
      TGlass   =   class(TCustomControl)  
      private  
          FColor:   TColor;  
          FStyle:   TGlassStyle;  
          FOnPaint:   TNotifyEvent;  
   
          procedure   SetColor(Value:   TColor);  
          procedure   SetStyle(Value:   TGlassStyle);  
          procedure   CMCtl3DChanged(var   Message:   TMessage);   message   CM_CTL3DCHANGED;  
          procedure   WMEraseBkgnd(var   Message:   TMessage);   message   WM_ERASEBKGND;  
          procedure   WMWindowPosChanging(var   Message:   TWMWindowPosChanging);   message   WM_WINDOWPOSCHANGING;  
      protected  
          Buffer:   TBitmap;  
   
          procedure   CreateParams(var   Params:   TCreateParams);   override;  
          procedure   Paint;   override;  
          procedure   Resize;   override;  
      public  
          constructor   Create(AOwner:   TComponent);   override;  
          destructor   Destroy;   override;  
          property   Canvas;  
      published  
          property   Align;  
          property   Anchors;  
          property   AutoSize;  
          property   BiDiMode;  
          property   BorderWidth;  
          property   Color:   TColor   read   FColor   write   SetColor;  
          property   Ctl3D;  
          property   Enabled;  
          property   Style:   TGlassStyle   read   FStyle   write   SetStyle   default   gsSrcAnd;  
          property   Visible;  
   
          property   OnClick;  
          property   OnDblClick;  
          property   OnEnter;  
          property   OnExit;  
          property   OnMouseDown;  
          property   OnMouseMove;  
          property   OnMouseUp;  
          property   OnResize;  
          property   OnPaint:   TNotifyEvent   read   FOnPaint   write   FOnPaint;  
      end;  
   
  procedure   Register;  
   
  implementation  
   
  procedure   Register;  
  begin  
      RegisterComponents('Croco',   [TGlass]);  
  end;  
   
  function   GlassStyleToInt(gs:   TGlassStyle):   LongInt;  
  begin  
      case   gs   of  
          gsBlackness     :   Result   :=   cmBlackness;  
          gsDstInvert     :   Result   :=   cmDstInvert;  
          gsMergeCopy     :   Result   :=   cmMergeCopy;  
          gsMergePaint   :   Result   :=   cmMergePaint;  
          gsNotSrcCopy   :   Result   :=   cmNotSrcCopy;  
          gsNotSrcErase:   Result   :=   cmNotSrcErase;  
          gsPatCopy         :   Result   :=   cmPatCopy;  
          gsPatInvert     :   Result   :=   cmPatInvert;  
          gsPatPaint       :   Result   :=   cmPatPaint;  
          gsSrcAnd           :   Result   :=   cmSrcAnd;  
          gsSrcCopy         :   Result   :=   cmSrcCopy;  
          gsSrcErase       :   Result   :=   cmSrcErase;  
          gsSrcInvert     :   Result   :=   cmSrcInvert;  
          gsSrcPaint       :   Result   :=   cmSrcPaint;  
          gsWhiteness     :   Result   :=   cmWhiteness;  
          else                       Assert(True,   'Error   parameter   in   function   GlassStyleToInt');  
      end;  
  end;  
   
  constructor   TGlass.Create(AOwner:   TComponent);  
  begin  
      inherited   Create(AOwner);  
      Buffer   :=   TBitmap.Create;  
   
      ControlStyle   :=   [csAcceptsControls,   csCaptureMouse,   csClickEvents,  
          csDoubleClicks,   csReplicatable];  
      Width   :=   100;  
      Height   :=   100;  
      FStyle   :=   gsSrcAnd;  
      ParentCtl3d   :=   False;  
      Ctl3D   :=   False;  
      ParentColor   :=   False;  
      FColor   :=   clWhite;  
  end;  
   
  destructor   TGlass.Destroy;  
  begin  
      Buffer.Free;  
      inherited   Destroy;  
  end;  
   
  procedure   TGlass.Paint;  
  var  
      R:   TRect;  
      rop:   LongInt;  
  begin  
      R   :=   Rect(0,   0,   Width,   Height);  
      Buffer.Width   :=   Width;  
      Buffer.Height   :=   Height;  
      Buffer.Canvas.Brush.Style   :=   bsSolid;  
      Buffer.Canvas.Brush.Color   :=   FColor;  
      Buffer.Canvas.FillRect(Rect(0,   0,   Width,   Height));  
      rop   :=   GlassStyleToInt(FStyle);  
      StretchBlt(Buffer.Canvas.Handle,   0,   0,   Width,   Height,  
                            Canvas.Handle,   0,   0,   Width,   Height,   rop);  
      if   Ctl3D   then   DrawEdge(Buffer.Canvas.Handle,   R,   BDR_RAISEDINNER,   BF_RECT);  
      Buffer.Canvas.Pen.Mode   :=   pmCopy;  
      Buffer.Canvas.Pen.Style   :=   psSolid;  
      Canvas.Draw(0,   0,   Buffer);  
      if   Assigned(FOnPaint)   then   FOnPaint(Self);  
  end;  
   
   
  procedure   TGlass.SetColor(Value:   TColor);  
  begin  
      if   Value   <>   FColor   then  
      begin  
          FColor   :=   Value;  
          RecreateWnd;  
      end;  
  end;  
   
  procedure   TGlass.CreateParams(var   Params:   TCreateParams);  
  begin  
      inherited   CreateParams(Params);  
   
      Params.ExStyle   :=   Params.ExStyle   +   WS_EX_TRANSPARENT;  
  end;  
   
  procedure   TGlass.WMWindowPosChanging(var   Message:   TWMWindowPosChanging);  
  begin  
      Invalidate;  
   
      inherited;  
  end;  
   
  procedure   TGlass.WMEraseBkgnd(var   Message:   TMessage);  
  begin  
      Message.Result   :=   0;  
  end;  
   
  procedure   TGlass.Resize;  
  begin  
      Invalidate;  
   
      inherited;  
  end;  
   
  procedure   TGlass.CMCtl3DChanged(var   Message:   TMessage);  
  begin  
      inherited;  
   
      RecreateWnd;  
  end;  
   
  procedure   TGlass.SetStyle(Value:   TGlassStyle);  
  begin  
      if   Value   <>   FStyle   then  
      begin  
          FStyle   :=   Value;  
          RecreateWnd;  
      end;  
  end;  
   
  end.  
  Top

5 楼bobdylan(风)回复于 2004-11-09 15:52:17

我是想保留其不透明的属性,既,加一个TransParent属性,来选择.  
  我原来用的Panel的基类是TCustomPanel,若改成TCustomControl,那原来的属性会不会没有了呀?  
  还请高手指点!Top

6 楼bobdylan(风)回复于 2004-11-09 16:20:35

也就是在保留原来Panel属性的前提下,增加透明属性。(TCustomPanel的基类是TCustomControl)  
  请高手指点!Top

7 楼wjtwuji(看不懂,眼晕(心魔作祟))回复于 2004-11-09 16:21:10

太长了!我看不下来!Top

8 楼Jason5858(Beckham)回复于 2004-11-09 16:36:58

不用这么长吧??  
  好象很短就可以了!  
  Top

9 楼bobdylan(风)回复于 2004-11-10 11:20:23

谢谢支持,问题已解决!Top