メインウィンドウ

ここで、雛形を作ります。 仮想関数を利用します。 そして、既定の動作は"よくある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プログラムと同じで、メニューなしとします。

MyMainWnd.h

setMyWndメソッドは、メインウィンドウの定義用です。 他は、ウィンドウメッセージを処理するためのメソッドです。 この後、メソッドは増えていきますが減らすことはしません。 それは、仮想関数だから、増えても困らないのです。

MyWinMain.cpp

MyMainWndクラスを継承した MyApp クラスの変数を用意しました。

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

そして、必要なところにメンバーをおきます。

// ToDo ウィンドウの定義
	wnd.setMyWnd(wc, cs);

ですから、MyApp クラスを作らなければいけません。 しかし、このファイルも追加はあっても減ることはしません。 これで、前に作ったアプリケーションにも影響を与えません。 ですから、雛形として使えます。

MyApp.h

では、"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" を保存します。

BCC Developer の設定

フォルダは次のようになっています。

クラスなどの共通のヘッダファイルは、"include"フォルダに入れます。 ですから、BCC Developer のインクルードパスへ、上の "include" を追加しておきます。

プロジェクト名が "win118" のとき、"win118"フォルダができます。 ここへ、"MyApp.h" やリソースファイルを保存します。 そして、"src"フォルダの、"MyWinMain.cpp" を追加します。

Visual C++ Express Edition の設定

Visual C++ Express Edition の場合も載せます。

フォルダ構成は、上と同じです。 インクルードパスの設定です。 [ツール]-[オプション] を開きます。

[VC++ ディレクトリ]-[Win32]-[インクルードファイル] を開きます。

赤丸をクリックして、"$(InputDir)"と入力します。 次に、共通の"include" ディレクトリを指定します。


[前] [目次] [次]