「Windows API」の版間の差分

削除された内容 追加された内容
画像ハンドルの使い方について。
1,364 行
 
しかし、透明化の自作はメンドウだし、せっかく自作しても互換性が悪いから、普通はそういうことはせず、GDI+のインクルードなどをして、PNG画像など透明化の機能をもった画像形式を活用するのが一般的である。
 
 
== Win32 API での画像表示に必要な知識 ==
まず、表示したい画像そのものの作成は、アクセサリ「ペイント」で先にすませておく必要がある。
 
LoadImage という命令で、ビットマップ画像の読み込みができる。しかし、事前に、
 
画像操作用のハンドルをHBITMAP 型を使って宣言しないといけない。「ハンドル」とは、なにやら正体が不明だが、ウィンドウプログラミングでファイル操作をするときとかに、宣言する必要になることになる、何かである。
 
マイクロソフト社の人が、こういう仕様で作ってしまったので、ユーザーは従うしかない。
 
おそらく、きっとファイル操作などに必要なメモリ領域やハードディスク領域の確保でも、たぶん宣言しているのだろう。画像のハンドルなら、きっと画像ファイルの操作に必要な領域の確保でもしているのだろう。
 
とにかくコードは、
<source lang=c>
HBITMAP hbmp;
 
// 画像をファイルから読み込む
hbmp = (HBITMAP)LoadImage(NULL, TEXT("yomikomittai_gazou.bmp"), IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
</source>
 
のようになる。このような順序で、宣言することになる。上のコードでは、「yomikomittai_gazou」という名前のビットマップ画像を読み込む。
 
 
 
さて、Win32 API では、ウィンドウ内での画像の表示と、画像データの作成は、別の命令になる。当然だが、ウィンドウ外部には画像を表示できない。
 
ウィンドウ内への画像の表示には、BitBlt 関数を使う。
 
さらに、表示先の画面と、画像作成用の仮想的な画面とが、分かれている。
 
 
<source lang=c>
TextOut(hdc, 10, 30, TEXT("テスト"), 3);
</source>
のように、通常の設定では「hdc」という名前の画面が、ウィンドウ内の画像表示用の画面である。
 
 
画像作成用の仮想的な画面は、自分で宣言する必要がある。
 
例えば、もし画像作成用の画面の名前を hbackDC にするなら、下記のように宣言する。
 
<source lang=c>
HDC hbackDC = CreateCompatibleDC(hdc);
</source>
 
こうすることで、 hdc と互換性のある、画像作成用の領域が確保される。
 
なお、大文字のHDCは型名である。小文字の hdc とは意味が違うので、区別するように。
 
 
 
そして、 hbackDC で作成した画像を表示するには、例えば
<source lang=c>
BitBlt(hdc, 0, 0, 700, 500, hbackDC, 0, 0, SRCCOPY);
</source>
のように、hdcに転写しなければならない。
 
 
 
使い終わったハンドルは、
<source lang=c>
DeleteObject(hbmp);
</source>
で削除しなければならない。(そういう仕様になっている。削除しないと、一例として、画像描画の関数ブロックを2回目以降に利用するときに、前回の画像描画で使用した画像がメモリ内に残ってたりして、画像がバグったりする。)
 
 
しかし、使用中のほかの画面や画像と関連づけてると削除できない(そういう仕様)ので、
<source lang=c>
hbmp = NULL;
DeleteObject(hbmp);
</source>
のように、NULLを入れてから削除すると、確実に削除できる。
 
使い終わった、画像作成用の画面を削除する場合は、DeleteDC を使う。これまた、使用中のほかのハンドルと関連づけていると削除できない(そういう仕様)ので、
 
<source lang=c>
SelectObject(hbackDC, NULL);
DeleteDC(hbackDC);
</source>
のように、NULLと関連づけさせてから、削除することで、確実に削除できる。
 
 
 
== 参考リンク ==