ここで、雛形を作ります。 仮想関数を利用します。 そして、既定の動作は"よくあるWindowsプログラム" と同じにします。
メンバーが仮想関数の MyMainWnd クラスを作ります。 ファイル名は、"MyMainWnd.h" です。 必要になったら、メンバーを増やします。 減らすことはしません。
#ifndef __MYMAINWND
#define __MYMAINWND
class MyMainWnd{
public:
virtual void setMyWnd(MyWndClass& wc, MyCreateStruct& cs){}
virtual void wmCreate(){}
virtual void wmDestroy(){}
virtual void wmClose(){
DestroyWindow(hWnd);
}
virtual void wmPaint(HDC& hdc){}
virtual void wmCommand(int wmId){}
};
#endif
次は、WinMain 関数が入った "MyWinMain.cpp" です。 「リソース」の所でやったファイルに追加します。
/* よくあるウィンドウズプログラム */ #include <windows.h> #include <tchar.h> #include "Resource.h" #include <MyWndClass.h> #include <MyCreateStruct.h> #include <MyMainWnd.h> #include "MyApp.h" #define MAX_LOADSTRING 100 // グローバル変数 MyApp wnd; // ウインドウプロシージャ宣言 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; cs.Text(AppTitle); // キャプション // ToDo ウィンドウの定義 wnd.setMyWnd(wc, cs); // ウインドウクラスの登録 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; PAINTSTRUCT ps; HDC hdc; 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; default: wnd.wmCommand(wmId); break; } break; case WM_CREATE: wnd.wmCreate(); break; case WM_TIMER: InvalidateRect(hWnd, NULL, FALSE); break; case WM_SIZE: InvalidateRect(hWnd, NULL, FALSE); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); wnd.wmPaint(hdc); EndPaint(hWnd, &ps); 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; }
既定の動作は、よくあるWindowsプログラムと同じで、メニューなしとします。
setMyWndメソッドは、メインウィンドウの定義用です。 他は、ウィンドウメッセージを処理するためのメソッドです。 この後、メソッドは増えていきますが減らすことはしません。 それは、仮想関数だから、増えても困らないのです。
MyMainWndクラスを継承した MyApp クラスの変数を用意しました。
// グローバル変数 MyApp wnd;
そして、必要なところにメンバーをおきます。
// ToDo ウィンドウの定義 wnd.setMyWnd(wc, cs);
ですから、MyApp クラスを作らなければいけません。 しかし、このファイルも追加はあっても減ることはしません。 これで、前に作ったアプリケーションにも影響を与えません。 ですから、雛形として使えます。
では、"MyApp.h" を作ります。ファイル名はこれでなければいけません。 メニューの付いたアプリケーションです。
// // MyApp.h // class MyApp : public MyMainWnd{ public: void setMyWnd(MyWndClass& wc, MyCreateStruct& cs){ wc.Menu(L"MyMenu"); }; };
実行画面です。
勿論、本体用に、"MyApp.cpp" を作ってもいいでしょう。
さて、フォルダは次のようにします。
"include" と "src" フォルダには、共通となるファイルを保存します。 ですから、"MyWndClass.h"、"MyCreateStruct.h"、"MyWndClass.h" などは "include" フォルダへ保存します。 "MyWinMain.cpp" は、"src" フォルダへ保存します。
"win111" などは、アプリケーションごとのフォルダです。 プロジェクトのフォルダということです。 ここに、"Resource.h"、"***.rc"、"MyApp.h" を保存します。
フォルダは次のようになっています。
クラスなどの共通のヘッダファイルは、"include"フォルダに入れます。 ですから、BCC Developer のインクルードパスへ、上の "include" を追加しておきます。
プロジェクト名が "win118" のとき、"win118"フォルダができます。 ここへ、"MyApp.h" やリソースファイルを保存します。 そして、"src"フォルダの、"MyWinMain.cpp" を追加します。
Visual C++ Express Edition の場合も載せます。
フォルダ構成は、上と同じです。 インクルードパスの設定です。 [ツール]-[オプション] を開きます。
[VC++ ディレクトリ]-[Win32]-[インクルードファイル] を開きます。
赤丸をクリックして、"$(InputDir)"と入力します。 次に、共通の"include" ディレクトリを指定します。