ちうわけで、パレットの設定が終わったら、画像データ(?)を読み込みます。パレットと同じようにデータを解析して適当に表示しても良いのですが
、便利そうなシステムサービス関数を見つけたので今回はこれを使用してみました。
んー、面倒ですが仕方ない(謎)のでちゃちゃっと説明しちゃいますね。
まず、最初のLoadImage関数、ここではビットマップファイルをメモリ内に読み込むといった処理をしています。
| 書式 | HANDLE LoadImage( HINSTANCE hinst, LPCTSTR lpszName , UINT uType , int cxDesired , int cyDesired , UINT fuLoad );
|
| hinst | イメージが格納されているアプリケーションのインスタンスを認識するハンドル。
そもそもこの関数はリソースと呼ばれる実行ファイル(*.EXE)に含まれるデータから読み込むものなので、関係ないからNULLぢゃ。 |
| lpszName | ファイル名 |
| uType | ロードするイメージのタイプを指定するのですが、ビットマップを読み込むのでIMAGE_BITMAPを指定。 |
| cxDesired | 横幅 |
| cyDesired | 縦幅 |
| fuLoad | ロード用のフラグ。今回は外部ファイルからビットマップを読み込むという事でLR_CREATEDIBSECTION | LR_LOADFROMFILEを指定。 |
| 戻り値 |
ロードされたイメージのハンドル
|
そうしたら、次にhdcs=CreateCompatibleDC(NULL);を実行し、適当なデバイスコンテキストを作成します(戻り値:デバイスコンテキストのハンドル)。
次に、hbmpold=SelectObject(hdcs,hbmp);を実行し、デバイスコンテキストに先ほど読み込んだビットマップを選択させます(戻り値:選択前のオブジェクト)。これでビットマップが読み込まれているデバイスコンテキストへのハンドルが取得できた事になります。よくわかりませんが、GDIはこういうものです(爆)。
まぁ、細かい事は気にせず、こうすれば良いという事を覚えてしまえばいいでしょう。
で、第4回で記述したように、サーフェイスへのデバイスコンテキストハンドルを取得し、BitBltというGDI関数を使用してビットマップをサーフェイスに転送します。
| 書式 | BOOL BitBlt( HDC hdcDest, int nXDest , int nYDest , int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop );
|
| hdcDest | 転送先のデバイスコンテキストのハンドル |
| nXDest | 転送先の左上X座標 |
| nYDest | 転送先の左上Y座標 |
| nWidth | 画像の横幅 |
| nHeight | 画像の縦幅 |
| hdcSrc | 転送元のデバイスコンテキストのハンドル |
| nXSrc | 転送元の左上X座標 |
| nYSrc | 転送元の左上Y座標 |
| dwRop | 転送時のオプションのようなものだが、ここは「そっくりそのまま転送」を意味するSRCCOPYを指定。 |
| 戻り値 | 成功するとTRUEが返ってくるらしい。 |
最後に、後始末です。最初にSelectObject(hdcs,hbmpold);としていますが、これはhdcsに変更前のオブジェクトを選択していると言う事です(謎)。そうしたら
DeleteDCで適当に作成したデバイスコンテキストを消去し、DeleteObjectで、メモリ内に読み込んであるビットマップを消去しています。
だー、もうGDIはよーわからん(^^;こんなんだからMS-DOSからWindowsになかなか移行できんプログラマが多いのだよ・・・。今回は(も?)カット&ペーストでそのまま使用して下さい(逝)。