![]()
[対象バージョン]
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.
|
![]()