第31章 グラフィックス


今回は、グラフィックスについて解説します。 C言語編26章でグラフィックスは使っている処理系やら 何やらに依存しているので、取り扱わないなどとエラそーなことを 書きましたが、今回あえて取り上げます。 Microsoft社製のコンパイラ以外では全く当てはまりません。 しかし、関数名などは違っていても似たような使い方が できるはずです。マニュアルやらヘルプなどを参照して下さい。 ここでは、グラフィクスの使い方を解説するのではなく、 これをC++の特徴であるクラスを利用してうまい使い方が ないかを考えます。 始めに、マイクロソフトのグラフィックライブラリについて 簡単に説明します。 MS-C, VC++1.51をお持ちの方は、したのプログラムを 実行してみて下さい。

#include <stdio.h> #include <graph.h> #include <process.h> #include <conio.h> int main(void) { struct videoconfig vf; if(!_setvideomode(_MAXRESMODE)) { perror(""); exit(-1); } _getvideoconfig(&vf); printf("X軸上のピクセル=%d, Y軸上のピクセル=%d\n", vf.numxpixels, vf.numypixels); getch(); _setvideomode(_DEFAULTMODE); return 0; }

あれ、これC言語じゃないの!?

はい。グラフィックを始めるときと終わるときのおきまりの パターンです。ファイル名は*.cでも*.cppでもどちらでもいいです。 _setvideomode関数はビデオモードの設定です。 引数にいろいろな定数を入れて設定します。_MAXRESMODEは最大 解像度のモードです。videoconfig構造体は次のように 定義されています。

struct _videoconfig { short numxpixels; /* number of pixels on X axis */ short numypixels; /* number of pixels on Y axis */ short numtextcols; /* number of text columns available */ short numtextrows; /* number of text rows available */ short numcolors; /* number of actual colors */ short bitsperpixel; /* number of bits per pixel */ short numvideopages; /* number of available video pages */ short mode; /* current video mode */ short adapter; /* active display adapter */ short monitor; /* active display monitor */ short memory; /* adapter video memory in K bytes */ };

_getvideoconfig関数によりビデオモードを取得します。 必要なければ実行しなくても差し支えありません。 それと、グラフィックスの終了時にビデオモードを デフォルトに戻しておくのを忘れないで下さい。 それと、perror関数はご存知でしょうか。 これは、メッセージを標準エラーに出力します。 stdio.hで定義されています。printfですと標準出力が リダイレクトされている場合ユーザーに気づかれないことがある ので、これを使います。標準エラーは常に画面です。 準備はたったのこれだけです。他のコンパイラのライブラリでも 似たような物でしょう。

#include <iostream.h> #include <graph.h> #include <conio.h> #include <stdio.h> #include <string.h> #include <process.h> class Graphics { short x1, x2, x3, y1, y2, y3; public: Graphics(); ~Graphics(); void TriAngle(void); void RectAngle(void); void SetPoint(short, short, short, short, short, short); }; Graphics::Graphics(void) { x1=x2=x3=y1=y2=y3=0; if(!_setvideomode(_MAXRESMODE)) { perror("エラーです\n"); exit(-1); } } Graphics::~Graphics(void) { _setvideomode(_DEFAULTMODE); } void Graphics::TriAngle(void) { _moveto(x1, y1); _lineto(x2, y2); _lineto(x3, y3); _lineto(x1, y1); return; } void Graphics::RectAngle(void) { _rectangle(_GBORDER, x1, y1, x2, y2); return; } void Graphics::SetPoint (short p1x, short p1y, short p2x, short p2y, short p3x, short p3y ) { x1 = p1x; y1 = p1y; x2 = p2x; y2 = p2y; x3 = p3x; y3 = p3y; return; } int main(void) { Graphics G; G.SetPoint(10, 10, 50, 50, 10, 50); G.TriAngle(); G.SetPoint(60, 10, 100, 50, 0, 0); G.RectAngle(); _getch(); return 0; }

ライブラリ関数の_movetoや_linetoは読んで字のごとくの 関数です。_rectangleの最初の引数は線で囲んでという意味です。 オブジェクトGを生成して、各点の位置を入力そして三角形やら 四角形を描くという物です。 ここで注意しなくてはいけないことは、_setvideomode関数が 実行されると画面がクリアされてしまうことです。 四角形を描くのにGraphics B;などとすると コンストラクタが呼ばれて_setvideomodeが実行され せっかく描いた三角形が消されてしまいます。 これを利用して古い図形を消して新たに 描画するときに用いるということも考えられます。

ま、左の図のように三角形と四角形ができれば成功です。 あと、色を付けたり塗りつぶしたりは自分でやってみて下さい。 わざわざクラスを作るほどの物ではありませんが練習してみて下さい。 Graphicsクラス自体も、もう少しまともな物に作り替えてみて下さい。 使っているライブラリが、マイクロソフト以外の方は ここで定義しているメンバ関数の中身を自分のコンパイラの 関数で書き換えて下さい。そうすればmain関数は上の例と 全く同じでよくなります。


[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Mar/12/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。