DDB : DeviceDependentBitmap : Device に依存する Bitmap
DIB : DeviceIndependentBitmap : Device に依存しない Bitmap
POINT
現在の OS では 違いを意識する必要はない.
file に保存する場合はDIB
WARNING
Bitmap を描画するには MemoryDevice 間を Copy しないとだめ
if ( msg == WM_CREATE )
{
HANDLE hBmp;
// ファイルからロード
hBmp = (HBITMAP)LoadImage( 0, "test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
// リソースからロード
HINSTANCE hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE );
hBmp = (HBITMAP)LoadImage( hInst, MAKEINTRESOURCE( ID_BMP_0 ), IMAGE_BITMAP, 0, 0, 0 );
// 現在の Device と同じ Format の MemoryDeviceContext( Memory 上の領域 ) を作成
// [ BackBuffer ] のこと
hDCBmp = CreateCompatibleDC( NULL );
// Bitmap Data を設定
SelectObject( hDCBmp, hBmp );
return 0;
}
if ( msg == WM_PAINT )
{
// BackBuffer から FrontBuffer へ Copy
HDC hDC = GetDC( hWnd );
BitBlt( hDC, 0, 0, 64, 64, hDCBmp, 0, 0, SRCCOPY );
return 0;
}
CreateCompatibleDC( 0 ); // NULL 指定では 1*1 monoclome
BMP を Load しないで work を作成する場合は,
HBITMAP CreateCompatibleBitmap( HDC, w, h );
POINT
解放・削除の処理には注意が必要
特にDeleteDC(), ReleaseDC()の使い分けには注意
「Create〜」で始まる関数で「作成」したら「Delete〜」で「削除」
「Get〜」で「取得」 したら、「Release〜」で「解放」
■ CreateCompatibleBitmap
SYNTAX
HBITMAP CreateCompatibleBitmap(
HDC hCD, // デバイスコンテキストのハンドル
int w, h // ビットマップの幅, 高さ ( ピクセル単位 )
);
DESC
デバイスコンテキストに関連付けられているデバイスと互換性のあるビットマップを作成
作成されるビットマップの色形式は
hdc パラメータで指定したデバイスの色形式と同じになる
このビットマップは
元のデバイスと互換性のあるどの
メモリデバイスコンテキストでも選択できる。
メモリデバイスコンテキストでは
カラーとモノクロのどちらのビットマップも利用できるので
指定されたデバイスコンテキストがメモリデバイスコンテキストであった場合と
それ以外の場合では
CreateCompatibleBitmap() が返すビットマップの形式は異なる。
メモリデバイスコンテキスト以外のデバイスコンテキスト用に作成された互換ビットマップは常に
指定されたデバイスコンテキストと同じ色形式、同じカラーパレットを使う。
w, h を 0 を指定した場合は 1 × 1 のモノクロビットマップが作成される。
WARNING
CreateCompatibleDC() でメモリデバイスコンテキストを作成すると
最初は 1×1 モノクロームのビットマップが選択されている。
カラーのビットマップを作成するには
そのメモリデバイスコンテキストを作成するために使われた hDC を指定すること
// Memory DC は最初は 1*1 の BMP をもつ
HDC hDCMem = CreateCompatibleDC (hDC);
// hDCMem ではなく、生成元の hDC を指定することでカラー構成のビットマップを作成する。
HBITMAP memBM = CreateCompatibleBitmap (hDC, w, h );
// DC に指定する
SelectObject ( hDCMem, memBM);
■ LoadImage
SYNTAX
HANDLE LoadImage(
HINSTANCE hinst, // インスタンスのハンドル
LPCTSTR lpszName, // イメージの名前( 識別子 )
UINT uType, // イメージのタイプ
int cxDesired, // 希望する幅
int cyDesired, // 希望する高さ
UINT fuLoad // ロードのオプション
);
DESC
アイコン, カーソル アニメーションカーソル, ビットマップをロードする
LoadImage() のような多機能な関数では
ビットマップ以外のハンドルを返す必要もあるので
HANDLE 型のような ものが必要になる