メインウィンドウ

クラスを使ってみます。

よくあるウィンドウズプログラム(2)

リソースの所でやったプログラムを書き直します。 リソースファイルは、"win112.rc" をコピーして、"win116.rc" とりネームします。 "Resource.h" はコピペします。 ソースファイルは、"win116.cpp" です。

/*
	よくあるウィンドウズプログラム
*/

#include	<windows.h>
#include	<tchar.h>
#include	"Resource.h"
#include	<MyWndClass.h>
#include	<MyCreateStruct.h>

#define MAX_LOADSTRING 100

// グローバル変数

// ウインドウプロシージャ宣言
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

// アプリケーション開始位置
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int nCmdShow)
{
	hInst = hInstance;	// インスタンスハンドル保存
	
	TCHAR AppName[MAX_LOADSTRING];	// メインウィンドウのクラス名
	TCHAR AppTitle[MAX_LOADSTRING];	// タイトル
	
	// リソース
	LoadString(hInst, IDC_APP_NAME, AppName, MAX_LOADSTRING);	
	LoadString(hInst, IDS_APP_TITLE, AppTitle, MAX_LOADSTRING);
	
	MSG msg;		// MSG構造体
	MyWndClass wc(AppName);		// WNDCLASSEX構造体
	MyCreateStruct cs(AppName);	// CREATESTRUCT構造体
	HACCEL hAccelTable;
	
	// ToDo ウィンドウの定義
	wc.Menu(L"MyMenu");					// メニュー
	cs.Text(AppTitle);					// キャプション
	
	
	// ウインドウクラスの登録
	if(RegisterClassEx(&wc) == 0) return  0;
	// ウインドウの作成
	hWnd = CreateWindowEx(cs);
	if(hWnd == NULL) return  0;
	// ウィンドウの表示
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
	
	hAccelTable = LoadAccelerators(hInst, MAKEINTRESOURCE(IDC_APP_NAME));
	// メッセージループ
	while(GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	return msg.wParam;
}

// ウインドウプロシージャ
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
	hWnd = hwnd;	// ウィンドウハンドル保存
	int wmId, wmEvent;
	
	switch(msg)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wp);
		wmEvent = HIWORD(wp);
		// 選択されたメニューの解析:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, L"MyAboutBox", hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);		// メッセージループの終了
		break;
	default:
		return DefWindowProc(hWnd, msg, wp, lp);	// 既定のウィンドウプロシージャ
	}
	return 0;
}

// バージョン情報
INT_PTR CALLBACK About(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
	switch (msg)
	{
	case WM_INITDIALOG:
		return (INT_PTR)TRUE;
	case WM_COMMAND:
		if (LOWORD(wp) == IDOK)
		{
			EndDialog(hDlg, LOWORD(wp));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}

実行画面です。

解説

このプログラムをスタート地点とします。 この後はコードを追加するだけです。 追加は2点だけです。 1つ目は、既定のメインウィンドウを変えたいとき、ToDo の所へ書く。 2つ目は、Wimdows から送られてくるメッセージに答えるの2点です。 このために、仮想関数を利用します。


[前] [目次] [次]