半透明Panel控件问题

来源:互联网 发布:淘宝上哪个符点是真的 编辑:程序博客网 时间:2024/05/18 02:59

 

unit TransPanel;interfaceuses  Windows, Messages, SysUtils, Classes, Controls, Forms, Graphics, StdCtrls;type  TBlendValue = 0..100;  TTransPanel = class(TCustomcontrol)  private    Fborder: Boolean;    FAlignment: TAlignment;    FBlendValue: TBlendValue;    FColor:TColor;    procedure Setborder(Value: Boolean);    procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;    procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;    procedure SetAlignment(const Value: TAlignment);    procedure SetBlendValue(const Value: TBlendValue);    procedure SetColor(Value: TColor);  protected    Buffer: TBitmap;    procedure Paint; override;  public    procedure CreateParams(var Params: TCreateParams); override;    constructor Create(AOwner: TComponent); override;    destructor Destroy; override;  published    property Alignment: TAlignment read FAlignment write SetAlignment default taCenter;    property Anchors;    property Border: Boolean read Fborder write Setborder;    property Color: TColor read FColor write SetColor;    property BlendValue: TBlendValue read FBlendValue write SetBlendValue;    property Caption;    property Font;    property Visible;    property Enabled;    property Align;    property OnClick;    property OnMouseDown;    property OnMouseMove;    property OnMouseUp;  end;procedure Register;implementation{TTransPanel }procedure Register;begin  RegisterComponents('Touchbook', [TTransPanel]);end;constructor TTransPanel.Create(AOwner: TComponent);begin  inherited Create(AOwner);  Buffer := TBitmap.Create;  Width := 185;  Height := 41;  FAlignment := taCenter;  Color:=clBtnFace;  BlendValue:=50;end;destructor TTransPanel.Destroy;begin  Buffer.Free;  inherited Destroy;end;procedure TTransPanel.CreateParams(var Params: TCreateParams);begin  inherited CreateParams(Params);  Params.ExStyle := Params.ExStyle + WS_EX_TRANSPARENT;  ControlStyle := ControlStyle - [csOpaque] + [csAcceptsControls];end;procedure TTransPanel.Paint;const  Alignments: array[TAlignment] of Longint = (DT_LEFT, DT_RIGHT, DT_CENTER);var  Rect: TRect;  FontHeight: Integer;  Flags: Longint;  sBlendFunction: BlendFunction;begin  inherited Paint;  with sBlendFunction do  begin    BlendOp := AC_SRC_OVER;    BlendFlags := 0;    AlphaFormat := 0;    SourceConstantAlpha:=  (255 * FBlendValue) div 100 ;  end;  Rect := GetClientRect;  Buffer.Width:=Width;  Buffer.Height:=Height;  with Buffer.Canvas do  begin    Brush.Color:=FColor;    FillRect(Rect);  end;  with Canvas do  begin    Windows.AlphaBlend(Canvas.Handle,0,0,Width,          Height,Buffer.Canvas.Handle,0,0,          Buffer.Width,Buffer.Height,sBlendFunction);    if Fborder or (csDesigning in ComponentState) then    begin      Canvas.Brush.Color := clBtnShadow;      Canvas.FrameRect(Rect);    end;  end;end;procedure TTransPanel.Setborder(Value: Boolean);begin  if Value <> Fborder then  begin    Fborder := Value;    RecreateWnd;  end;end;procedure TTransPanel.WMWindowPosChanging(var Message: TWMWindowPosChanging);begin  inherited;  Invalidate;end;procedure TTransPanel.WMEraseBkgnd(var Message: TWmEraseBkgnd);begin  Message.Result:= 1;end;procedure TTransPanel.SetAlignment(const Value: TAlignment);begin  FAlignment := Value;  RecreateWnd;end;procedure TTransPanel.SetColor(Value: TColor);begin  if Value <> FColor then  begin    FColor := Value;    RecreateWnd;  end;end;procedure TTransPanel.SetBlendValue(const Value: TBlendValue);begin  if FBlendValue <> Value then  begin    FBlendValue := Value;    RecreateWnd;  end;end;end.


测试过程中发现的问题:
1、设计时,两个TransPanel之前的BringtoFront、SendtoBack无效。
2、设计时,两个TransPanel部分重叠,失去焦点,背景里不完全重画。
3、设计时,同时选中两个TransPanel,透明效果会慢慢无效。
4、设计时,TransPanel在Button上层覆盖半个Button,然后移开Button。会发现Button前景没有重画。

总之问题还是很多。请达人帮忙完美一下
转自:http://bbs.2ccc.com/topic.asp?topicid=293675

 

 

原创粉丝点击