Windowsプログラミングに関する世界観(GDI+)です。
GDIとDirectXは、Windowsでグラフィックプログラミングを行う上で欠かすことのできないAPI。
基本的に、二次元のグラフィックスにはGDIを使う。簡単なカードゲームなど、3Dの必要ないゲームを作る時や、ペイントソフトをWindowsで実装したい場合には、GDIを使う。
GDIはペンやブラシを用いた個性的なAPIを持っていて、C/C++以外に.NET言語などからも利用できる。
3Dのより高度なグラフィックスを用いたゲームなどを作りたい時はDirectXを使う。OpenGLはLinuxなどからも利用可能なオープン系の3D技術だが、Windowsにおいて、たとえばミニ戦車で戦う3Dのネットゲームを作りたい時などは基本的にDirectXを使う。一昔前のWindowsでは、DirectXが標準では搭載されておらず、ネットゲームをインストールする際にMSのサイトからDirectXをダウンロードして導入する必要があった。
最近のゲームはC/C++のほかC#などで作られることもある。特にUnityなどの最新のゲームエンジンでは、Monoを主要プラットフォームにしているため、MSとは関係がなくてもC#を使う必要がある。また、XboxなどのMS系のハードでもC#を使うことが多い。(プレステなどはカーネルにFreeBSDなどを使っていたこともある。)
デバイスコンテキストは、Windowsとデバイスの橋渡し役のようなもの。
Windowsはデバイスを直接操作するのではなく、デバイス・コンテキストを仲介役として操作する。
後日注記:ある意味、何かを表示するには、まずデバイスコンテキストを取得してから。デバイスコンテキストを取得してしまえば、あとはそれに対して表示領域を操作することでグラフィックスを表示できる。そのように考えると良いかもしれない。
以下が参考になります。
以下にサンプルコードがあります。
特にVisual C++でグラフィックスの描画を行うには、とにかくCDC*を使います。
CDC*で宣言されたデバイス操作用のポインタを使って、たとえば
CDC* pDC = hoge_pict.GetDC(); pDC->SetPixel(x,y,RGB(255,0,0)); // 赤い点を表示
などのように、とにかくCDC*を使って、アロー演算子でデバイスコンテキストを取得・操作しまくります。
色を指定する場合は、上のようにRGBマクロを使って、
RDB(赤, 緑, 青);
のように指定します。
とにかくデバイスコンテキストを操作するためにCDCを使う、ということを頭においておけば、あとは簡単です。
pDC->MoveTo(X座標1, Y座標1); pDC->LineTo(X座標2, Y座標2);
で直線を引けるほか、上手くLineTo()を繰り返し使うことで折れ線も引けます。
四角形は
pDC->Rectangle(X座標1, Y座標1, X座標2, Y座標2);
円は
pDC->Ellipse(X座標1, Y座標1, X座標2, Y座標2)
で描けます。
またCPenクラスと
CreatePen(ペンの種類, ペンの幅, ペンの色);
を使うことで色のついたペンを使うことができます。
今からどのペンを使うかは
pDC->SelectObject(ペンへのポインタ);で設定します。
(新Visual C++6.0入門 スーパービギナー編 (Visual C++6.0実用マスターシリーズ)を参考に執筆・引用しました。)
デバイスコンテキストは、たとえばビットマップリソースであれば、
CDC* pDC = hoge_pict.GetDC();
のようにコントロールメンバのhoge_pictからpDCとして参照できる出力対象として使ったり、
CDC hogeDC; hogeDC.CreateCompatibleDC(pDC);
のようにメモリ上の一時的な作業領域として「メモリデバイスコンテキスト」を確保したりできます。
この状態で、たとえばSelectObject()関数を使って、CBitmap型オブジェクトのhogeBMPを、メモリデバイスコンテキストのhogeDCと関連付けられます。
繰り返し関連付けすることでいくつもの画像を表示できます。
(新Visual C++6.0入門 スーパービギナー編 (Visual C++6.0実用マスターシリーズ)を参考に執筆・引用しました。)
C++では、プログラム内で一度取得したものは、必ずプログラム内で破棄(解放)しなければなりません。
デバイスコンテキストを、
GetDC();
で取得したら、それを解放する
ReleaseDC(pDC);
をきちんと行いましょう。
(作ってわかるVISUAL C++ 6.0を参考に執筆しました。)
DirectXも参照のこと。
LinuxでのベクターグラフィックスAPIであるCairo(GTKやFirefoxなどが採用)は、WindowsプラットフォームのGDIにも対応しています。
Cairoを参照のこと。