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