クラスを使ってみます。
リソースの所でやったプログラムを書き直します。 リソースファイルは、"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点です。 このために、仮想関数を利用します。