|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"透明なパネル"
意地でもグラフィックコントロールをウィンドウコントロールより上に置きた
い場合にでもどうぞ。ただしこのパネルの下にあるコントロールは触ることは
できません。再描画もされなくなります。再描画させたい場合は、透過パネル
のInvalidate を呼び出します。OnPaintで描画もできます。
そのままTransPanel.pasというファイルに丸書きすればコンポ登録できます。
unit TransPanelSmp;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TTransPanel = class(TPanel)
private
{ Private 宣言 }
ReEntry: Boolean;
FOnPaint: TNotifyEvent;
procedure WMEraseBkgnd(var Message: TWmEraseBkgnd);
message WM_ERASEBKGND;
procedure WMWindowPosChanged(var Message: TWMWindowPosChanged);
message WM_WINDOWPOSCHANGED;
protected
{ Protected 宣言 }
procedure CreateParams(var Params: TCreateParams); override;
procedure Paint; override;
public
{ Public 宣言 }
constructor Create(AOwner: TComponent); override;
procedure Invalidate; override;
published
{ Published 宣言 }
property Canvas;
property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TTransPanel]);
end;
{ TTransPanel }
constructor TTransPanel.Create(AOwner: TComponent);
begin
inherited;
with Canvas do begin
Pen.Color := clHighlight;
Pen.Style := psDot;
Brush.Style := bsClear;
end;
ControlStyle := ControlStyle - [csCaptureMouse, csOpaque,
csClickEvents, csDoubleClicks,
csReflector, csMenuEvents,
csNoStdEvents];
end;
procedure TTransPanel.CreateParams(var Params: TCreateParams);
begin
Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
inherited CreateParams(Params);
end;
procedure TTransPanel.WMEraseBkgnd(var Message: TWmEraseBkgnd);
var
rc: TRect;
OrgDesignMode: Boolean;
rgn: THandle;
i: Integer;
begin
rgn := CreateRectRgn(0, 0, Width, Height);
try
for i := Parent.ControlCount-1 downto 0 do
if Parent.Controls[0] = Self then
SelectClipRgn(Canvas.Handle, rgn);
finally
DeleteObject(rgn);
end;
if ReEntry then exit;
ReEntry := True;
OrgDesignMode := csDesigning in ComponentState;
try
SetDesigning(False);
Visible := False;
rc := BoundsRect;
InvalidateRect(Parent.Handle, @rc, False);
UpdateWindow(Parent.Handle);
Visible := True;
finally
SetDesigning(OrgDesignMode);
ReEntry := False;
Message.Result := 0;
end;
end;
procedure TTransPanel.WMWindowPosChanged(var Message:
TWMWindowPosChanged);
begin
inherited;
if HandleAllocated then begin
InvalidateRect(Handle, nil, True);
UpdateWindow(Handle);
end;
end;
procedure TTransPanel.Paint;
begin
if Assigned(OnPaint) then OnPaint(Self);
end;
procedure TTransPanel.Invalidate;
begin
if HandleAllocated then Perform(WM_ERASEBKGND, 0, 0);
end;
end.
▲● 2000/02/21 22:53 JDX06162(とんちんかんちんかとちん)
■ http://pc2.techno-ware-unet.ocn.ne.jp/~kato/
Inprise Delphi ... The Great Development Kit
uses D2Desktop, D3CSS, D4CSS, D5ENT;
Original document by かとちん 氏 ID:(JDX06162)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|