簡易グラフィック(1)

今回は、ダイアログ上にグラフィックを表示する方法をあつかいます。グラフィックをするには、 GDI関数群を使います。
まず、以下のような何もないダイアログを作ります。
graph DIALOG 6, 13, 199, 127
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "簡易グラフィック"
FONT 12, "System"
BEGIN
END
それから、以下のソースを書きます。
#include <windows.h>
#include <math.h>
#ifdef WIN32
#define MoveTo(hdc, x, y) (MoveToEx((hdc), (x), (y), NULL))
#endif

#ifdef __cplusplus
extern "C"
#endif
BOOL FAR PASCAL graph(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam){
	PAINTSTRUCT ps;
	HDC hdc;
	HPEN hpen, hpenOld;
	int i;
	switch(msg){
	case WM_COMMAND:
		switch((WORD)wParam) {
		case IDCANCEL:		/* 「×」ボタンもしくは、システムメニューの「クローズ」 */
			EndDialog( hDlg, wParam );
			break;
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hDlg, &ps);
		BitBlt(hdc, 0, 0, 320, 240, NULL, 0, 0, BLACKNESS);/*黒で塗りつぶす*/
		MoveTo(hdc, 0, 0); LineTo(hdc, 320, 240);
			/*↑黒の上に黒で線を引いても見えない*/
		hpen=GetStockObject(WHITE_PEN);
		hpenOld=SelectObject(hdc, hpen);
		MoveTo(hdc, 0, 120); LineTo(hdc, 320, 120);
		MoveTo(hdc, 160, 0); LineTo(hdc, 160, 240);
		SelectObject(hdc, hpenOld);
		DeleteObject(hpen);
		for (i=0; i<320; ++i)
			SetPixel(hdc, i, sin(i*3.14/160)*20+120, RGB(255, 255, 255));
		EndPaint(hDlg, &ps);
		break;
	case WM_INITDIALOG:
		return TRUE;/* SetFocusしたらfalse */
	default:
		return FALSE;
	}
	return TRUE;
}
int PASCAL WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int cmdshow){
	DLGPROC lpProc = (DLGPROC)MakeProcInstance((FARPROC)graph, hinst);
	DialogBox(hinst, "graph", NULL, lpProc);
	FreeProcInstance((FARPROC)lpProc);
	return 0;
}
graph.rcファイル
#include "graph.dlg"
DEFファイルは省略しますが、16ビットの方はEXPORT宣言を忘れないでください。

実行結果

WM_PAINTメッセージ

ウィンドウが作成された直後や、他のウィンドウに隠されていたウィンドウが見えるようになった時、 サイズ変更された時など、システムから送られてきます。プログラム中から送るにはInvaridateRect() API等を使います。

デハイスコンテキスト(DC)

何かを描くには、それをどこに描くかを指定しなければなりません。そのために、 デバイスコンテキスト(DC)を使います。これには、 等があります。

WM_PAINTメッセージに応答して、画面に表示するにはBeginPaint()APIでDCを取得し、 描画し終わったらEndPaint()でそれを解放します。実際にBeginPaint()の戻り値として得られるのは DCのハンドル(HDC)です。よく使う描画関数には、以下のような物があります。

SelectObject

DCには、ペンやブラシやフォントなどの描画の道具(GDIオブジェクト)が選択(接続)されています。 デフォルトのままでは困る場合は、それを変更します。手順は
  1. hpen=GetStockObject(WHITE_PEN);などのように、システムが標準で持っている オブジェクトを取得することができます。もしくは、CreatePen()、 CreateSolidBrush()、CreateFontIndirect()などで作成します。
  2. hpenOld=SelectObject(hdc, hpen)のように、DCにセレクトします。 このとき必ずSelectObjectの返値(元のオブジェクト)を保存しておきます。
  3. 実際の描画作業を行います。
  4. 終わったらSelectObject(hdc, hpenOld);のように、元のオブジェクトをDCにセレクト しなおします。
  5. DeleteObject(hpen);のように、GDIオブジェクトを削除します。
の五段階の作業になります。 なお、GetStockObject()で取得したオブジェクトは、DeleteObject()を省略できます。 もちろんDeleteObject()しても問題ありません。

前のページ

次のページ

一つ上のページに戻る