この関数を使えば、上記のフォーマットを扱えるようです。
これは画像にかかるサイズの削減につながりますね。
「多重起動の防止」のソースをスケルトンとして使います。
ウィンドウプロシージャ内に以下の内容を追加していきましょう。
//デバイスコンテキスト・仮想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