请教高手 透明 panel 的实现
想实现透明 panel , 如下做的
但是 这样的话 bevelOuter := False 不起作用 不知道为什么?
就是 老是突出 显示 能看到外边框
这个如何解决?
unit TransPanel;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs,
ExtCtrls;
type
TTransPanelStyle = (
gsBlackness, gsDstInvert, gsMergeCopy, gsMergePaint,
gsNotSrcCopy,
gsNotSrcErase, gsPatCopy, gsPatInvert, gsPatPaint,
gsSrcAnd,
gsSrcCopy, gsSrcErase, gsSrcInvert, gsSrcPaint,
gsWhiteness);
TTransPanel = class(TCustomControl)
private
FColor: TColor;
FStyle: TTransPanelStyle;
FOnPaint: TNotifyEvent;
procedure SetColor(Value: TColor);
procedure SetStyle(Value: TTransPanelStyle);
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: TTransPanelStyle 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;
implementation
function TransPanelStyleToInt(gs: TTransPanelStyle):
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 TransPanelStyleToInt');
end;
end;
constructor TTransPanel.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 TTransPanel.Destroy;
begin
Buffer.Free;
inherited Destroy;
end;
procedure TTransPanel.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 := TransPanelStyleToInt(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 TTransPanel.SetColor(Value: TColor);
begin
if Value <> FColor then
begin
FColor := Value;
RecreateWnd;
end;
end;
procedure TTransPanel.CreateParams(var Params:
TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle + WS_EX_TRANSPARENT;
end;
procedure TTransPanel.WMWindowPosChanging(var Message:
TWMWindowPosChanging);
begin
Invalidate;
inherited;
end;
procedure TTransPanel.WMEraseBkgnd(var Message:
TMessage);
begin
Message.Result := 0;
end;
procedure TTransPanel.Resize;
begin
Invalidate;
inherited;
end;
procedure TTransPanel.CMCtl3DChanged(var Message:
TMessage);
begin
inherited;
RecreateWnd;
end;
procedure TTransPanel.SetStyle(Value: TTransPanelStyle);
begin
if Value <> FStyle then
begin
FStyle := Value;
RecreateWnd;
end;
end;
end.
问题点数:20、回复次数:2Top
1 楼baguli(巴古里)回复于 2003-09-04 19:02:30 得分 20
我有一个透明TPanelPro的Source Code,需要的话可以Q我6113690Top
2 楼cdsgajxlp(起名很难)回复于 2004-03-23 13:10:42 得分 0
weTop




