1日でわかるMFC (GARAさんのページ)
BACK  
 Sample_B メニューを持つWindowsプログラム

Sample_B1.c はSDKのプログラムです。
Sample_B2.cpp はメインウィンドウをクラス化しています。
Sample_B3.cpp はメインウィンドウをクラス化し、メッセージ処理の一部をアプリケーションクラスに実装しています。

プログラム概要
・ メニューをクリックするとメッセージボックスを表示します。



共通ファイル
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 ファイル共通です)
TOP  
/** 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 ファイル共通です)
TOP  
/** 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 ファイル共通です)
TOP  
/** 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