フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: 1 [2]
トピック: デスクトップにお絵かき (DelWiki)
DEKO
管理者
投稿数: 2690
Re: デスクトップにお絵かき (DelWiki)
on: 2013/05/06 22:51 Mon

完全透明でいいのですから、Alphablend ではなく TransparentBlt を使った方が簡潔に書けますね > インチキコード。

procedure TForm1.Button1Click(Sender: TObject);
var
hDesktopDC: HDC;
BitMap: TBitmap;
begin
hDesktopDC := GetDC(GetDesktopWindow);
BitMap := TBitmap.Create;
try
Bitmap.LoadFromFile('C:\aero_arrow.bmp');
Windows.TransparentBlt(hDesktopDC, 30, 530, 32, 32, Bitmap.Canvas.Handle, 0, 0, 32, 32, $00000000);
// Winapi.Windows.TransparentBlt(hDesktopDC, 30, 530, 32, 32, Bitmap.Canvas.Handle, 0, 0, 32, 32, $00000000); // XE2 or later
finally
Bitmap.Free;
ReleaseDC(GetDesktopWindow, hDesktopDC);
end;
end;

 
See Also:
[TransparentBlt API]
http://msdn.microsoft.com/ja-jp/library/cc428776.aspx

Mr.XRAY
メンバー
投稿数: 192
Re: デスクトップにお絵かき (DelWiki)
on: 2013/05/06 22:54 Mon

32 ビットアルファチャンネル付きのビットマップについて追記しておきます.
DEKO さんのコードでテストする際,マウスカーソルの画像からビットマップを生成するコードです.
Delphi 2009 以降専用です.
画像形式の変換用のアプリやソフトを使用しないで,コードで操作する場合の参考です.

画像形式の変換コードは,ネット上にありますが,Vista 以降に対応するには,
アルファチャンネルの処理が必要となってきます.
もちろん,Delphi 2007 以前用のコードでも,自力でコーディングすれぱ可能ですが,
効率がいいとは言えません.

procedure TForm1.Button1Click(Sender: TObject);
var
hCur : HCURSOR;
ABitMap : TBitmap;
begin
hCur := LoadCursorFromFile('aero_arrow.cur');

ABitMap := TBitmap.Create;
try
ABitMap.PixelFormat := pf32bit;
ABitMap.AlphaFormat := afDefined;
ABitMap.Width := GetSystemMetrics(SM_CXCURSOR);
ABitMap.Height := GetSystemMetrics(SM_CYCURSOR);

DrawIconEx(ABitMap.Canvas.Handle,
0,
0,
hCur,
0,
0,
0,
0,
DI_DEFAULTSIZE or DI_IMAGE);


Image1.Picture.Assign(ABitMap);
ABitMap.SaveToFile('aero_arrow.bmp');
finally
DestroyCursor(hCur);
FreeAndNil(ABitMap);
end;
end;

  
結果は下図のようになります.表示している TImage の Transparent の値は,デフォルトの False のままです.
Delphi の TImage はアルファチャンネルの画像表示をサポートしています.

 
[LoadCursorFromFile] MSDN
http://msdn.microsoft.com/ja-jp/library/cc364831.aspx

ページ: 1 [2]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.031 sec.