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
関数という、ビュークラスの独自メンバ関数を呼び出している。
サンプルはこちらから |