BITMAP とは Windows が標準でサポートしている画像フォーマットである。
画像の 1 ピクセル当たりのビット数により、以下のような種類がある。
| ビット数 |
内容 |
| 1 |
白黒ビットマップである。 |
| 4 |
最大 16 色のビットマップである。 |
| 8 |
最大 256 色のビットマップである。 |
| 16 |
最大 2^16 = 65,536 色のビットマップである。 |
| 24 |
最大 2^24 = 16,777,216 色のビットマップである。 |
| 32 |
最大 2^32 = 4,294,967,296 色のビットマップである。 |
フォーマットは、ビット数に応じて、様々である。
以下のサンプルプログラムは、SDI で作成し、すべてのビットマップを表示する。
|
BITMAPファイルを読み込む場合、Win32 API の LoadImage 関数を使用する。
HANDLE LoadImage(
HINSTANCE hInst,
LPCTSTR lpszName,
UINT uType,
int cxDesired,
int cyDesired,
UINT fuLoad )
| hInst |
ビットマップファイルを読み込む場合、NULL を指定する |
| lpszName |
読み込むファイル名を指定する |
| uType |
ビットマップファイルを読み込む場合、IMAGE_BITMAP を指定する |
| cxDesired |
実際のリソースの幅を表示する場合、0 を指定する |
| cyDesired |
実際のリソースの幅を表示する場合、0 を指定する |
| fuLoad |
以下の組み合わせである。(or 演算子で連結する)
| LR_DEFAULTCOLOR |
デフォルトのフラグ
LR_MONOCHROME でないことのみを指定 |
| LR_CREATEDIBSECTION |
DIBセクションマップを戻り値に設定 |
| LR_DEFAULTSIZE |
このフラグを指定し、cxDesired および cyDesired を 0 にした場合、表示にシステムメトリックが使用される
このフラグを指定しない場合、実際のリソースのサイズが使用される |
| LR_LOADFROMFILE |
lpszName で指定されるファイルからイメージを読み込む |
| LR_LOADMAP3DCOLORS |
イメージ内の灰色部(ダークグレー、グレー、ライトグレー)を対応する 3D カラーに置き換える |
| LR_LOADTRANSPARENT |
イメージ内の最初のピクセルの色を取得し、カラーテーブル内の対応するエントリをデフォルトウィンドウカラー
(COLOR_WINDOW) に置き換える |
| LR_MONOCHROME |
イメージを白黒で読み込む |
| LR_SHARED |
イメージハンドルを共有する |
|
|
LoadImage 関数の戻り値を HBITMAP 型にキャストして、対象の BITMAP へのハンドルを取得する。
以下の例では、ドキュメントクラス内の OnOpenDocument 関数内で上記関数の呼び出しと、BITMAP
へのハンドルの取得を行っている。(m_hMyBitmap は HANDLE 型の private 変数としてある。)
実際に描画するためのコーディングはビュークラス内の OnDraw 関数内に記述する。
CDocument クラスのグローバルメンバ関数である GetBitmapHandle 関数は、上記の
BITMAP へのハンドルを取得する。
通常、BITMAP の表示は以下の手順で行う。
| CBitmap クラスの初期化 |
BITMAP ハンドルを用いて、CBitmap オブジェクトを構築する |
| メモリデバイスコンテキストの作成 |
表示デバイスと同等なメモリ領域を構築する |
| オブジェクトの選択 |
メモリデバイスオブジェクトに対し、対象オブジェクトを選択する |
| BITMAP構造体の取得 |
オブジェクト情報を取得する |
| 画面への表示 |
BitBlt 関数を使用し、表示デバイスへのデータ転送を行う |
| メモリデバイスコンテキストの解放 |
メモリデバイスコンテキストを開放する |
なお、上記例では、表示したのち、ウィンドウサイズを修正するために ChangeViewSize
関数という、ビュークラスの独自メンバ関数を呼び出している。
サンプルはこちらから |