[対象バージョン]

Delphi 2.0J 3.0J

[説明]

実行時のフォームの背景を透明にして後ろの画像などが見えるようにします。

[対処法]

フォームの背景色として透明というのはありません。そこでデスクトップの画像を取り込みフォームが隠している部分をフォームの Canvas へコピーすることでフォームが透けているように見せます。この処理をそれぞれ FormCreate, FormPaint, WMMove ハンドラに記述すれば透明フォームができあがります。

[サンプルソース]

unit Unit1;

interface

uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, ExtCtrls;

type
    TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
private
    { Private 宣言 }
    {フォームを移動時に書き直す}
    procedure WMMove(var Msg: TWMMove);
         message WM_MOVE;

public
    { Public 宣言 }
    DesktopBitmap: hBitmap;
    MemDC, DeskDC: hDC;
    itix,itiy,keisan : integer;
end;


var
    Form1: TForm1;

implementation

{$R *.DFM}


procedure TForm1.FormCreate(Sender: TObject);
begin
    DeskDC := GetDC(0);
    MemDC := CreateCompatibleDC(DeskDC);
    DesktopBitmap := CreateCompatibleBitmap(DeskDC, Screen.Width, Screen.Height);
    SelectObject(MemDC, DesktopBitmap);
    BitBlt(MemDC, 0, 0, Screen.Width, Screen.Height, DeskDC, 0, 0, SRCCOPY);
    DeleteDC(MemDC);
    ReleaseDC(0, DeskDC);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
    DeleteObject(DesktopBitmap);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
    keisan := Form1.Width - Form1.ClientWidth ;
    keisan := keisan div 2 ;
    itix := Form1.Left + keisan;
    itiy := Form1.top + Form1.Height - Form1.ClientHeight - keisan;
    MemDC := CreateCompatibleDC(Canvas.Handle);
    SelectObject(MemDC, DesktopBitmap);
    BitBlt(Canvas.Handle, 0, 0, Width, Height, MemDC, itix, itiy, SRCCOPY);
    DeleteDC(MemDC);
end;

procedure TForm1.WMMove(var Msg: TWMMove);
begin
    keisan := Form1.Width - Form1.ClientWidth ;
    keisan := keisan div 2 ;
    itix := Form1.Left + keisan;
    itiy := Form1.top + Form1.Height - Form1.ClientHeight - keisan;
    MemDC := CreateCompatibleDC(Canvas.Handle);
    SelectObject(MemDC, DesktopBitmap);
    BitBlt(Canvas.Handle, 0, 0, Width, Height, MemDC, itix, itiy, SRCCOPY);
    DeleteDC(MemDC);
end;

end.
       



FAQ目次に戻る