この関数を使えば、上記のフォーマットを扱えるようです。
これは画像にかかるサイズの削減につながりますね。
「多重起動の防止」のソースをスケルトンとして使います。
ウィンドウプロシージャ内に以下の内容を追加していきましょう。
//デバイスコンテキスト・仮想DC
HDC hdc, hdcMem;
PAINTSTRUCT paint ;
//読み込むビットマップ
HBITMAP hBitmap;
//透過色
COLORREF TranspColor;
画面上のデバイスコンテキストとビットマップ、
ビットマップ用のメモリDCのハンドルを
格納するための変数を宣言します。
また透過描画も扱うので、透過色用変数も宣言します。
//デバイスコンテキストを取得
hdc = BeginPaint(hwnd, &paint);
//画像(bmp,jpg,png,gif)を読み込む
hBitmap = SHLoadImageFile(_T("\\My Documents\\png.png"));
//仮想デバイスコンテキストを作成
hdcMem = CreateCompatibleDC(NULL);
//仮想デバイスコンテキストにビットマップを設定
SelectObject(hdcMem, hBitmap);
//仮想DCからDCへコピー・透過コピー
BitBlt(hdc,0,0,32,32,hdcMem,0,0,SRCCOPY);
TranspColor=GetPixel(hdcMem,0,0);
TransparentImage(hdc,104,80,32,32,hdcMem,0,0,32,32,TranspColor);
//仮想デバイスコンテキストを削除
DeleteDC(hdcMem);
//ビットマップを削除
DeleteObject(hBitmap);
//デバイスコンテキストを解放
EndPaint(hwnd, &paint);
SHLoadImageFile 関数で画像をメモリに読み込みます。
ファイルを読み込む時は絶対パスを指定しなくてはなりません。
ちなみに、このプログラムでは、このPNG形式のファイルを
MyDocumentsディレクトリに置いて、使うことにします。
(単に拡張子を変えたわけではなく、本物のPNGファイルです。念のため)
メモリDCを作成し、SelectObjectでビットマップをメモリDCに設定します。
BitBltで描画し、ビットマップの(0,0) の色を透過色にして
TransparentImageで透過描画しています。
用が終わったらメモリDCを削除し、ビットマップを削除します。
では実行してみましょう。
PNGファイルならなんとか透過の用途にも使えることが判りました。
ちなみにこのbmp,jpg,gif,pngといった4つの形式の共通点は、
IEで表示できるということがあります。つまりOSレベルで
サポートされるようになったから簡単に扱えるわけですね。
そのへんは素直にMicrosoft様に感謝しておきましょう。
しかし、PNG形式が対応されたのは比較的最近なので、
以前の古いマシンではPNGファイルをIEで表示できないものがありますが
そういったマシンでは多分この関数でPNGファイルを表示できないので気をつけてください。
HBITMAP SHLoadImageFile ( LPCTSTR pszFileName);
・GIFを読み込みます(とMSDNにはありますが、PNGやJPGもいけるようです)
第一引数 pszFileName には、読み込むファイル名を指定します
戻り値 成功ならビットマップのハンドルが、失敗ならNULL が返ります。
※この関数を使うには、aygshell.h を宣言する必要があります
■ソースの表示■
2005/6/26