グラフィックス

Win32API関数を使って、ウィンドウに線や円を描くことができます。 そして、「ウィンドウに線を描け」のように使います。 実は、描画する対象を変えることができます。 「プリンタに線を描け」とか「メモリに線を描け」です。 描画する対象を、グラフィック出力対象とか、グラフィック・デバイス・コンテキストといいます。 そして、これらは HDC型のハンドルという数値で扱います。 このハンドルの値がわかればウィンドウに描画できるわけです。 このような Win32API関数を Graphics Device Interface (GDI) といいます。

線を描く(win141)

プロジェクト名は "win141" とします。 雛形である、"MyApp.h"、"win137.rc"、"resource.h" をコピーします。 次に、"win137.rc" をリネームして "win141.rc" とします。

//
//	MyApp.h
//

class MyApp : public MyMainWnd{
public:
	// WM_PAINT
	void wmPaint(HDC hdc){
		// 直線を描く
		MoveToEx(hdc, 10, 10, NULL);
		LineTo(hdc, 100, 100);
	}
};

実行画面です。

解説

線を描く方法

case WM_PAINT:
	PAINTSTRUCT ps;
	BeginPaint(hWnd, &ps);
	// 直線を描く----------------------------
	MoveToEx(ps.hdc, 10, 10, NULL);
	LineTo(ps.hdc, 100, 100);
	//---------------------------------------
	EndPaint(hWnd, &ps);
	break;

線や円を描くのは、WM_PAINT メッセージの中で行います。

線は、MoveToEx関数と LineTo関数を使います。 MoveToEx関数で始点、LineTo関数で終点を指定して線を描きます。 線を描き終わると、終点は始点となります。

ところで、どこへ描くのか指定しなければいけません。 メモリにも描くことができます。 それはメモリデバイスの所で説明します。 今は、メインウィンドウ画面です。 ps.hdc =画面なのです。 これで画面に描画できます。 画面を取得する方法は、次のようにします。


①PAINTSTRUCT構造体の変数 ps を用意する。
②BeginPaint関数を実行する。 このとき、引数に &ps を代入します。 これで、ps に画面の情報が入ります。
③描画が終わったら、EndPaint関数を実行する。

ですから、線を描くのは、BeginPaint関数とEndPaint関数の間で行います。 ちなみに、PAINTSTRUCT構造体は次のように定義されています。

typedef struct tagPAINTSTRUCT {  
    HDC  hdc; 
    BOOL fErase; 
    RECT rcPaint; 
    BOOL fRestore; 
    BOOL fIncUpdate; 
    BYTE rgbReserved[32]; 
} PAINTSTRUCT;

この hdc にメインウィンドウ画面のハンドルが代入されます。 また、BeginPaint関数の返値も同じ値ですから、それを使うこともできます。

雛形

もう一度、雛形の説明をします。

MyMainWndクラスをつくります。 描画用に、"wmPaint" メソッドを作ります。 virtual をつけ仮想関数にします。

#pragma once

class MyMainWnd{

public:

	
	virtual void wmPaint(HDC hdc){}
};

次は、MyMainWndクラスを継承した MyAppクラスを作ります。 そのファイル名は、"MyApp.h" とします。 そして、"MyDlgMain.cpp" に次のように書きます。

//
//	Windows プログラム
//

#include	"MyApp.h"

// グローバル変数
MyApp wnd;

そして、次のように "MyDlgMain.cpp" のプロシージャに書きます。

case WM_SIZE:
	InvalidateRect(hWnd, NULL, FALSE);
	return (INT_PTR)TRUE;
case WM_PAINT:
	hdc = BeginPaint(hWnd, &ps);
	wnd.wmPaint(hdc);
	EndPaint(hWnd, &ps);
	return (INT_PTR)TRUE;

ですから、"MyApp.h"で wmPaint メソッドを書けば描画できます。 ところで、"WM_SIZE" メッセージは、ウィンドウの大きさが変わったときに送られてくるメッセージです。 そのとき、再描画するようにします。


[目次] [次]