サンプルコードのダウンロード
では、まずサンプルコードをダウンロードし、解凍してください。
私はVisual C++6.0でコンパイルしているので、
お持ちの方はVisual C++でプロジェクトファイルを開いてください(「ddraw_04.dsw」をダブルクリックすれば開けます)。
圧縮ファイルに含まれる「ddraw_04.exe」をダブルクリックし、実行してみてください。
どうでしょう?画面が切り替わり、フルスクリーン化し、『GDIによるテキストの表示』という文字列が表示されると思います。
今回は、サーフェイスにGDI関数を使用して描画をします。
GDI概要
GDIとはGraphic Device Interfaceの略であり、ウィンドウプログラミングには欠かせないグラフィックライブラリです。
第1回でも記述しましたが、DirectDrawの関数には文字や線、円などの描画関数が用意されていません。その場合、GDIを使用してサーフェイスに描画する事になります。
ただ、GDIの描画速度はあまり速くないので、速度重視ゲームの場合、多用は控えた方が良いでしょう。
デバイスコンテキストハンドルの作成、解放
今回は、テキストを出力する部分を『DdTextOut』関数にまとめました。さぁコードを見てみましょう。
//----------[ GDI関数を使用してテキストの出力 ]---------------------------------------------- void DdTextOut(LPDIRECTDRAWSURFACE sf,int x,int y,char *str){ HDC hdc; sf->GetDC(&hdc); TextOut(hdc,x,y,str,strlen(str)); sf->ReleaseDC(hdc); } 略 //関数の呼び出し DdTextOut(lpFront,0,0,"GDIによるテキストの表示");
GDIで描画するためには、デバイスコンテキストを認識するハンドルというものを取得しなければなりません。
デバイスコンテキストを認識するハンドルとは、描画可能なメモリのパスを収納しておくような感じのもので、GDI関数呼び出し時によく引数として使用します。
では、ハンドルの取得方法を説明します。
書式 | HRESULT GetDC( HDC FAR *lphDC ); |
---|---|
lphDC | デバイス コンテキストが返されるハンドルへのポインタ。 |
戻り値 | DirectDrawオブジェクトの作成に成功するとDD_OKが返ってくるらしい。 |
「lpFront->GetDC(&hdc);」のように、途中「->」を記述しています。これらはC++で使われるクラスというものですが、ここでは解説省略。クラスについては他のHPを参照してください。
こうして、GetDCを実行すると、そのサーフェイス(今回はプライマリサーフェイス)のデバイスコンテキストを認識するハンドルを取得出来ます。
では、次にGDI関数の『TextOut』について説明します。
書式 | BOOL TextOut( HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString ); |
---|---|
hdc | デバイスコンテキストを認識するハンドル 今回は「hdc」を引き渡す。 |
nXStart | 描画先のX座標 |
nYStart | 描画先のY座標 |
lpString | 描画したい文字列 |
hdc | 文字列のバイト数(文字数とも言うかも) |
戻り値 | 成功した場合はTRUEが返ってくるらしい。 |
こうして、一通りGDI関数を使用したら、今度はハンドルを解放しなければなりません。
解放には、次の関数(サーフェイスのメンバ関数)を呼び出します。
書式 | HRESULT ReleaseDC( HDC hDC ); |
---|---|
hDC |
GetDCを使用して取得したデバイスコンテキストのハンドル。
今回はhdcを引き渡す。GetDCとは違い、ポインタでは無いことに注意しましょう。 |
戻り値 | DirectDrawオブジェクトの作成に成功するとDD_OKが返ってくるらしい。 |