Bitmap


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 型のような ものが必要になる