1日でわかるMFC (GARAさんのページ)
Sample_B メニューを持つWindowsプログラム
プログラム概要
・ メニューをクリックするとメッセージボックスを表示します。
共通ファイル
1)
Sample_B.h
#define MENU_NAME MAKEINTRESOURCE(IDM_MENU1) // メニュー名
#define WIN_W 500 // Window の幅
#define WIN_H 180 // Window の高
#define WIN_X 100 // Window の水平座標
#define WIN_Y 50 // Window の垂直座標
// リソース
#define IDM_MENU1 101
#define IDM_ITEM01 121
#define IDM_ITEM02 122
#define IDM_ITEM11 131
#define IDM_ITEM12 132
#define IDM_ITEM13 133
#define IDM_ITEM14 134
2)Sample_B.rc
#include <windows.h>
#include "Sample_B.h"
IDM_MENU1 MENU DISCARDABLE
BEGIN
POPUP "メニュー1"
BEGIN
MENUITEM "メニュー 1-@", IDM_ITEM01
MENUITEM "メニュー 1-A", IDM_ITEM02
END
POPUP "メニュー2"
BEGIN
MENUITEM "メニュー 2-@", IDM_ITEM11
MENUITEM "メニュー 2-A", IDM_ITEM12
MENUITEM "メニュー 2-B", IDM_ITEM13
MENUITEM "メニュー 2-C", IDM_ITEM14
END
END
Sample_B1.c SDKのプログラム (緑色の部分は各 .c ファイル共通です)
/** Sample_B1.c:メニューを持つWindowsプログラム (by GARA) **/
#include <windows.h>
#include "Sample_B.h"
/* Define */
#define CLASS_NAME "Sample_B1Class" // クラス名
#define WIN_TITLE "Sample_B1" // タイトル
/* Proto Type */
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL InitApplication(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
/* WinMain */
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
Sample_A1.c と同じ
}
/* ウィンドウクラスの登録 */
BOOL InitApplication(HINSTANCE hInstance)
{
Sample_A1.c と同じ
}
/* ウィンドウの作成と表示 */
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
Sample_A1.c と同じ
}
/* ウィンドウプロシージャ */
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
switch(uMsg) {
case WM_PAINT:
BeginPaint(hWnd, &ps);
hDC = ps.hdc;
TextOut(hDC, 10, 10, "SDK -> MFC", 10);
EndPaint(hWnd, &ps);
break;
case WM_COMMAND: // メニューが選択された
switch(LOWORD(wParam)) {
case IDM_ITEM01: // メニュー1−@
MessageBox(hWnd, "メニュー 1−@が選択されました", "メニュー", MB_OK);
break;
case IDM_ITEM02: // メニュー1−A
MessageBox(hWnd, "メニュー 1−Aが選択されました", "メニュー", MB_OK);
break;
case IDM_ITEM11: // メニュー2−@
MessageBox(hWnd, "メニュー 2−@が選択されました", "メニュー", MB_OK);
break;
case IDM_ITEM12: // メニュー2−A
MessageBox(hWnd, "メニュー 2−Aが選択されました", "メニュー", MB_OK);
break;
case IDM_ITEM13: // メニュー2−B
MessageBox(hWnd, "メニュー 2−Bが選択されました", "メニュー", MB_OK);
break;
case IDM_ITEM14: // メニュー2−C
MessageBox(hWnd, "メニュー 2−Cが選択されました", "メニュー", MB_OK);
break;
default:
return(DefWindowProc(hWnd, uMsg, wParam, lParam));
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, uMsg, wParam, lParam));
}
return 0;
}
Sample_B2.cpp メインウィンドウをクラス化 (緑色の部分は各 .cpp ファイル共通です)
/** Sample_B2.cpp:メニューを持つWindowsプログラム (by GARA) **/
#include <afxwin.h>
#include "Sample_B.h"
/* Define */
#define CLASS_NAME "Sample_B2Class" // クラス名
#define WIN_TITLE "Sample_B2" // タイトル
/* ウィンドウクラスの宣言 */
class CMainFrame : public CFrameWnd // ウィンドウクラス CWnd -> CFrameWnd
{
public:
// コンストラクタ
CMainFrame();
// メンバ関数
virtual BOOL PreCreateWindow(CREATESTRUCT&);
// メッセージハンドラ
afx_msg void OnPaint(); // WM_PAINT に対応
afx_msg void OnMenu_01(); // WM_COMMAND に対応(1対1)
afx_msg void OnMenu_02(); // WM_COMMAND に対応(1対1)
afx_msg void OnMenu(UINT); // WM_COMMAND に対応(4対1)
afx_msg void OnDestroy(); // WM_DESTROY に対応
DECLARE_MESSAGE_MAP()
};
/* メッセージマップの定義 */
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) // 第1引数:メッセージマップを所有するクラス名、第2引数:基本クラス名
ON_WM_PAINT()
ON_COMMAND(IDM_ITEM01, OnMenu_01)
ON_COMMAND(IDM_ITEM02, OnMenu_02)
ON_COMMAND_RANGE(IDM_ITEM11, IDM_ITEM14, OnMenu)
ON_WM_DESTROY()
END_MESSAGE_MAP()
/* アプリケーションクラスの宣言 */
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance(); // インスタンスを初期化する関数
};
/* ウィンドウクラスのメンバ */
// コンストラクタ
CMainFrame::CMainFrame() // コンストラクタ
{
Create(NULL, ""); // ウィンドウの作成。第1引数:クラス名、第2引数:ウィンドウ名
}
// メンバ関数
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) // PreCreateWindow() のオーバーライド
{
Sample_A2.cpp と同じ
}
// メッセージハンドラ
void CMainFrame::OnPaint() // OnPaint() のオーバーライド
{
HWND hWnd;
HDC hDC;
PAINTSTRUCT ps;
hWnd = m_hWnd; // m_hWnd は CWnd のメンバ変数
::BeginPaint(hWnd, &ps); // ::(グローバルスコープ解決演算子)をつける
hDC = ps.hdc;
TextOut(hDC, 10, 10, "SDK -> MFC", 10);
::EndPaint(hWnd, &ps);
return;
}
void CMainFrame::OnMenu_01() // 独自メンバー関数(オーバーライドでない)
{
HWND hWnd;
hWnd = m_hWnd;
::MessageBox(hWnd, "メニュー 1−@が選択されました", "メニュー", MB_OK);
return;
}
void CMainFrame::OnMenu_02() // 独自メンバー関数(オーバーライドでない)
{
// HWND hWnd;
// hWnd = m_hWnd;
// ::MessageBox(hWnd, "メニュー 1−Aが選択されました", "メニュー", MB_OK);
MessageBox("メニュー 1−Aが選択されました", "メニュー", MB_OK); // CWnd のメンバ関数を使用
return;
}
void CMainFrame::OnMenu(UINT wParam) // 独自メンバー関数(オーバーライドでない)
{
HWND hWnd;
hWnd = m_hWnd;
switch(LOWORD(wParam)) {
case IDM_ITEM11: // メニュー2−@
::MessageBox(hWnd, "メニュー 2−@が選択されました", "メニュー", MB_OK);
break;
case IDM_ITEM12: // メニュー2−A
::MessageBox(hWnd, "メニュー 2−Aが選択されました", "メニュー", MB_OK);
break;
case IDM_ITEM13: // メニュー2−B
::MessageBox(hWnd, "メニュー 2−Bが選択されました", "メニュー", MB_OK);
break;
case IDM_ITEM14: // メニュー2−C
::MessageBox(hWnd, "メニュー 2−Cが選択されました", "メニュー", MB_OK);
break;
}
return;
}
void CMainFrame::OnDestroy() // OnDestroy() のオーバーライド
{
PostQuitMessage(0);
return;
}
/* アプリケーションクラスのメンバ */
// メンバ関数
BOOL CMyApp::InitInstance() // InitInstance() のオーバーライド
{
m_pMainWnd = new CMainFrame(); // メインウィンドウの作成
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
/* アプリケーションの生成(実行)*/
CMyApp MyApp;
Sample_B3.cpp メッセージ処理の一部をアプリケーションクラスに実装 (緑色の部分は各 .cpp ファイル共通です)
/** Sample_B3.cpp:メニューを持つWindowsプログラム (by GARA) **/
#include <afxwin.h>
#include "Sample_B.h"
/* Define */
#define CLASS_NAME "Sample_B3Class" // クラス名
#define WIN_TITLE "Sample_B3" // タイトル
/* ウィンドウクラスの宣言 */
class CMainFrame : public CFrameWnd // ウィンドウクラス CWnd -> CFrameWnd
{
public:
// コンストラクタ
CMainFrame();
// メンバ関数
virtual BOOL PreCreateWindow(CREATESTRUCT&);
// メッセージハンドラ
afx_msg void OnPaint(); // WM_PAINT に対応
afx_msg void OnDestroy(); // WM_DESTROY に対応
DECLARE_MESSAGE_MAP()
};
/* メッセージマップの定義 */
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) // 第1引数:メッセージマップを所有するクラス名、第2引数:基本クラス名
ON_WM_PAINT()
ON_WM_DESTROY()
END_MESSAGE_MAP()
/* アプリケーションクラスの宣言 */
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance(); // インスタンスを初期化する関数
// メッセージハンドラ
afx_msg void OnMenu_01(); // WM_COMMAND に対応(1対1)
afx_msg void OnMenu_02(); // WM_COMMAND に対応(1対1)
afx_msg void OnMenu(UINT); // WM_COMMAND に対応(4対1)
DECLARE_MESSAGE_MAP()
};
/* メッセージマップの定義 */
BEGIN_MESSAGE_MAP(CMyApp, CWinApp) // 第1引数:メッセージマップを所有するクラス名、第2引数:基本クラス名
ON_COMMAND(IDM_ITEM01, OnMenu_01)
ON_COMMAND(IDM_ITEM02, OnMenu_02)
ON_COMMAND_RANGE(IDM_ITEM11, IDM_ITEM14, OnMenu)
END_MESSAGE_MAP()
/* ウィンドウクラスのメンバ */
// コンストラクタ
CMainFrame::CMainFrame() // コンストラクタ
{
Create(NULL, ""); // ウィンドウの作成。第1引数:クラス名、第2引数:ウィンドウ名
}
// メンバ関数
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) // PreCreateWindow() のオーバーライド
{
Sample_A2.cpp と同じ
}
// メッセージハンドラ
void CMainFrame::OnPaint() // OnPaint() のオーバーライド
{
HWND hWnd;
HDC hDC;
PAINTSTRUCT ps;
hWnd = m_hWnd; // m_hWnd は CWnd のメンバ変数
::BeginPaint(hWnd, &ps); // ::(グローバルスコープ解決演算子)をつける
hDC = ps.hdc;
TextOut(hDC, 10, 10, "SDK -> MFC", 10);
::EndPaint(hWnd, &ps);
return;
}
void CMainFrame::OnDestroy() // OnDestroy() のオーバーライド
{
PostQuitMessage(0);
return;
}
/* アプリケーションクラスのメンバ */
// メンバ関数
BOOL CMyApp::InitInstance() // InitInstance() のオーバーライド
{
m_pMainWnd = new CMainFrame(); // メインウィンドウの作成
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
// メッセージハンドラ
void CMyApp::OnMenu_01() // 独自メンバー関数(オーバーライドでない)
{
HWND hWnd;
hWnd = m_pMainWnd->GetSafeHwnd(); // GetSafeHwnd() でウィンドウハンドルを取得
MessageBox(hWnd, "メニュー 1−@が選択されました", "メニュー", MB_OK);
return;
}
void CMyApp::OnMenu_02() // 独自メンバー関数(オーバーライドでない)
{
m_pMainWnd->MessageBox("メニュー 1−Aが選択されました", "メニュー", MB_OK); // CWnd のメンバ関数を使用
return;
}
void CMyApp::OnMenu(UINT wParam) // 独自メンバー関数(オーバーライドでない)
{
HWND hWnd;
hWnd = m_pMainWnd->m_hWnd; // m_hWnd でウィンドウハンドルを取得
switch(LOWORD(wParam)) {
case IDM_ITEM11: // メニュー2−@
MessageBox(hWnd, "メニュー 2−@が選択されました", "メニュー", MB_OK);
break;
case IDM_ITEM12: // メニュー2−A
MessageBox(hWnd, "メニュー 2−Aが選択されました", "メニュー", MB_OK);
break;
case IDM_ITEM13: // メニュー2−B
MessageBox(hWnd, "メニュー 2−Bが選択されました", "メニュー", MB_OK);
break;
case IDM_ITEM14: // メニュー2−C
MessageBox(hWnd, "メニュー 2−Cが選択されました", "メニュー", MB_OK);
break;
}
return;
}
/* アプリケーションの生成(実行)*/
CMyApp MyApp;
BACK TOP