お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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