最終更新 2003 10/01
サンプルのダウンロード → API_Bitmap.lzh(45k)
全ソースコード
BitBlt 関数
CreateCompatibleDC 関数
LoadImage 関数
SelectObject 関数
DeleteObject 関数
DeleteDC 関数
対応しているバージョン
95, 98, Me, NT4.0以降, CE1.0以降, 2000, XP
必要なライブラリとヘッダ
wingdi.h
gdi32.lib
|
ビットマップを扱う方法の中で、一番簡単で分かりやすいのは
CompatibleDC() 関数と LoadImage() 関数を使った方法でしょうか。
おおまかな流れとしてはファイルかリソースからメモリへビットマップを
読み込んで、メモリにあるビットマップデータをウィンドウに貼り付ける
という感じです。
CompatibleDC() 関数でメモリにアクセスするための識別番号の
ようなものを取得します。
HDC(デバイスコンテキストハンドル)と呼ばれているものですが
これはデバイス(コンピューターに接続されている機器全て。たとえば
モニタ、キーボードなど)を識別するためにウィンドウズが自動的に
割り当てる値を保存するための変数です。
アクセスするデバイスを気にする必要がないということなので楽なのだ
そうですが、自分にはよく分かりません。
HDC型は全てのデバイスで共通に扱うための型みたいです。
たとえば、プリンタに文字を印刷したい場合もHDCを使います。
上のサンプルではメモリにアクセスする目的 ( memDC ) と
ウィンドウに絵を表示する目的 ( hDC ) で使われています。
HDCを取得したら LoadImage() 関数でファイルまたはリソースから
メモリへビットマップを読み込みます。
同時にビットマップハンドルを取得します。
ビットマップは同時にいくつもメモリに読み込む場合があるので、それらを
区別するための識別番号みたいなものが必要になります。
それがビットマップハンドルです。
サンプルソースでは hBit にあたります。
memDC と hBit は現段階ではバラバラに作成しただけで、全く関係のない
状態にあります。
ようするに赤の他人というわけです。
これを関係付けて恋人のような密接な関係にするのが SelectObject()
関数です。
「memDC と hBit は同じビットマップを指し示すものですよ〜。」
とシステムに報告します。
こうすることで BitBlt() 関数を使って、ウィンドウにビットマップを
表示させることができます。
以上の流れを書くとこんな感じです。
HDC hDC = GetDC( hWnd );
HDC memDC;
HBITMAP hBit;
memDC = CreateCompatibleDC( hDC );
hBit = (HBITMAP)LoadImage(
hInstance,
lpImageName,
IMAGE_BITMAP,
0, 0,
LR_CREATEDIBSECTION | LR_LOADFROMFILE
);
SelectObject( memDC, hBit );
ReleaseDC( hWnd, hDC );
|
サンプルではビットマップをメモリに読み込むための関数を作っているので
微妙に書き方が違うと思いますが、やっていることは同じです。
サンプルソースとよく見比べて違いを確認して見るとよいかも知れません。
BitBlt() 関数は次のようにして使います。
BitBlt(
転送先HDC,
転送先の位置x, 転送先の位置y,
表示横サイズ, 表示縦サイズ,
転送元HDC,
転送元の位置x, 転送元の位置y,
転送方法
);
転送方法はROP(ラスターオペレーション)と呼ばれていて転送元と
転送先をどのように合成して表示させるか?とういう値を指定します。
サンプルでは合成する必要がないので SRCCOPY を指定しています。
ROPの使い方は別のところで説明することになると思うので、ここでは
省略します。
さらにビットマップる
ビットマップをリソースに登録する方法
リソースに登録したビットマップを表示させる
複数のビットマップをメモリに読み込む
メモリ上に空のビットマップを作る
チラつかないビットマップ表示をするには
読み込んだビットマップを直接いじる
|