(←クリックするとアマゾンに行きます)

第4日目では、グラフィックスの表示方法を理解します。


これは、比較的簡単です。

四角形と直線が描画できると、簡単な表を描画することができます。 また、プリンタのデバイスコンテキストハンドルを取得できたなら、 帳票も印刷できます。

では、簡単な例を見てみましょう。

// table01.cpp

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);

char szClassName[] = "table";	//ウィンドウクラス


int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
				   LPSTR lpsCmdLine, int nCmdShow)
{
	MSG msg;
	BOOL bRet;
	
	if (!InitApp(hCurInst))
		return FALSE;
	if (!InitInstance(hCurInst, nCmdShow)) 
		return FALSE;
	while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
		if (bRet == -1) {
			break;
		} else {
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	return (int)msg.wParam;
}

//ウィンドウ・クラスの登録

ATOM InitApp(HINSTANCE hInst)
{
	WNDCLASSEX wc;
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WndProc;	//プロシージャ名
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInst;//インスタンス
	wc.hIcon = (HICON)LoadImage(NULL,
		MAKEINTRESOURCE(IDI_APPLICATION),
		IMAGE_ICON,
		0,
		0,
		LR_DEFAULTSIZE | LR_SHARED);
	wc.hCursor = (HCURSOR)LoadImage(NULL,
		MAKEINTRESOURCE(IDC_ARROW),
		IMAGE_CURSOR,
		0,
		0,
		LR_DEFAULTSIZE | LR_SHARED);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = NULL;	//メニュー名
	wc.lpszClassName = (LPCSTR)szClassName;
	wc.hIconSm = (HICON)LoadImage(NULL,
		MAKEINTRESOURCE(IDI_APPLICATION),
		IMAGE_ICON,
		0,
		0,
		LR_DEFAULTSIZE | LR_SHARED);

	return (RegisterClassEx(&wc));
}

//ウィンドウの生成

BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
	HWND hWnd;

	hWnd = CreateWindow(szClassName,
			"猫でもわかるWindowsプログラミング", //タイトルバーにこの名前が表示されます
			WS_OVERLAPPEDWINDOW, //ウィンドウの種類
			CW_USEDEFAULT,	//X座標
			CW_USEDEFAULT,	//Y座標
			CW_USEDEFAULT,	//幅
			CW_USEDEFAULT,	//高さ
			NULL, //親ウィンドウのハンドル、親を作るときはNULL
			NULL, //メニューハンドル、クラスメニューを使うときはNULL
			hInst, //インスタンスハンドル
			NULL);
	if (!hWnd)
		return FALSE;
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
	return TRUE;
}

//ウィンドウプロシージャ

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	int id, w, h, i, x, y;
	PAINTSTRUCT ps;
	HDC hdc;
	RECT rc;
	static HPEN hBigPen, hSmallPen;

	switch (msg) {
		case WM_CREATE:
			hBigPen = CreatePen(PS_SOLID, 4, RGB(0, 0, 0));
			hSmallPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
			break;
		case WM_PAINT:
			hdc = BeginPaint(hWnd, &ps);
			GetClientRect(hWnd, &rc);
			w = rc.right;
			h = rc.bottom;
			SelectObject(hdc, hBigPen);
			Rectangle(hdc, 30, 30, w - 30, h - 30);
			SelectObject(hdc, hSmallPen);
			for (i = 0; i < 10; i++) {
				y = 30 + ((h - 60) / 10) * i;
				MoveToEx(hdc, 30, y, NULL);
				LineTo(hdc, w - 30, y);
				x = 30 + ((w - 60) / 10) * i;
				MoveToEx(hdc, x, 30, NULL);
				LineTo(hdc, x, h - 30);
			}
			EndPaint(hWnd, &ps);
			break;
		case WM_CLOSE:
			id = MessageBox(hWnd, "終了してもよろしいですか",
					"終了確認", MB_YESNO);
			if (id == IDYES)
				DestroyWindow(hWnd);
			break;
		case WM_DESTROY:
			DeleteObject(hBigPen);
			DeleteObject(hSmallPen);
			PostQuitMessage(0);
			break;
		default:
			return (DefWindowProc(hWnd, msg, wp, lp));
	}
	return 0;
}
実行結果は、下の図のようになります。

ウィンドウサイズを変更すると、碁盤目の大きさも変わります。




20/Nov/2005 By Y.Kumei
[総合INDEX] [目次] [第3日]