1日でわかるMFC (GARAさんのページ)
BACK  
 Sample_A 標準的なWindowsプログラム

Sample_A1.c はSDKのプログラムです。
Sample_A2.cpp はメインウィンドウをクラス化しています。

プログラム概要
・ マウスで画面上を左クリックするとその位置に Hello World を表示します。
・ 「閉じる」ボタンをクリックすると確認のメッセージボックスを表示します。



共通ファイル
1)Sample_A.h
#define MENU_NAME   NULL        // メニュー名
#define WIN_W       500         // Window の幅
#define WIN_H       180         // Window の高
#define WIN_X       100         // Window の水平座標
#define WIN_Y       50          // Window の垂直座標

 Sample_A1.c SDKのプログラム (緑色の部分は各 .c ファイル共通です)
TOP  
/** Sample_A1.c:標準的なWindowsプログラム (by GARA) **/

#include <windows.h>
#include "Sample_A.h"

/* Define */
#define CLASS_NAME  "Sample_A1Class"    // クラス名
#define WIN_TITLE   "Sample_A1"         // タイトル

/* 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)
{
    MSG     msg;

    if(!hPrevInstance) {
        if(!InitApplication(hInstance))
            return FALSE;
    }
    if(!InitInstance(hInstance, nCmdShow)) {
        return FALSE;
    }
    while(GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

/* ウィンドウクラスの登録 */
BOOL InitApplication(HINSTANCE hInstance)
{
    WNDCLASS    wc;

    wc.style = CS_HREDRAW | CS_VREDRAW;                 // クラススタイル
    wc.lpfnWndProc = (WNDPROC)WndProc;                  // ウィンドウプロシージャ
    wc.cbClsExtra = 0;                                  // 
    wc.cbWndExtra = 0;                                  // 
    wc.hInstance = hInstance;                           // 
    wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);    // アイコン
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);           // カーソル
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);      // ウィンドウ背景ブラシ
    wc.lpszMenuName = MENU_NAME;                        // メニュー
    wc.lpszClassName = CLASS_NAME;                      // クラス名

    return(RegisterClass(&wc));
}

/* ウィンドウの作成と表示 */
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    HWND    hWnd;

    hWnd = CreateWindow(
                CLASS_NAME,             // クラス名(ResisterClass() で登録したクラス名)
                WIN_TITLE,              // Window 名(タイトルバーの文字)
                WS_OVERLAPPEDWINDOW,    // Window のスタイル(WS_OVERLAPPEDWINDOW:トップレベル)
                WIN_X,                  // Window の水平座標
                WIN_Y,                  // Window の垂直座標
                WIN_W,                  // Window の幅
                WIN_H,                  // Window の高
                NULL,                   // 親Window のハンドル
                NULL,                   // メニューのハンドル
                hInstance,              // インスタンスハンドル
                NULL);                  // Window 作成データのアドレス
    if(!hWnd)
        return FALSE;

    ShowWindow(hWnd, nCmdShow);         // Window の表示
    UpdateWindow(hWnd);

    return TRUE;
}

/* ウィンドウプロシージャ */
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC         hDC;
    PAINTSTRUCT ps;
    int         ret;

    switch(uMsg) {
        case WM_PAINT:
            BeginPaint(hWnd, &ps);
            hDC = ps.hdc;
            TextOut(hDC, 10, 10, "SDK -> MFC", 10);
            EndPaint(hWnd, &ps);
            break;
        case WM_LBUTTONDOWN:        // マウス左ボタンのクリック
            hDC = GetDC(hWnd);
            TextOut(hDC, LOWORD(lParam), HIWORD(lParam), "Hello World", 11);
            ReleaseDC(hWnd, hDC);
            break;
        case WM_CLOSE:
            ret = MessageBox(hWnd, "プログラムを終了しますか", "確認", MB_YESNO | MB_ICONQUESTION);
            if(ret == IDYES)
                DestroyWindow(hWnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return(DefWindowProc(hWnd, uMsg, wParam, lParam));
    }

    return 0;
}

 Sample_A2.cpp メインウィンドウをクラス化 (緑色の部分は各 .cpp ファイル共通です)
TOP  
/** Sample_A2.cpp:標準的なWindowsプログラム (by GARA) **/

#include <afxwin.h>
#include "Sample_A.h"

/* Define */
#define CLASS_NAME  "Sample_A2Class"    // クラス名
#define WIN_TITLE   "Sample_A2"         // タイトル

/* ウィンドウクラスの宣言 */
class CMainFrame : public CFrameWnd     // ウィンドウクラス CWnd -> CFrameWnd
{
public:
    // コンストラクタ
    CMainFrame();
    // メンバ関数
    virtual BOOL PreCreateWindow(CREATESTRUCT&);
    // メッセージハンドラ
    afx_msg void OnPaint();                     // WM_PAINT に対応
    afx_msg void OnLButtonDown(UINT, CPoint);   // WM_LBUTTONDOWN に対応
    afx_msg void OnClose();                     // WM_CLOSE に対応
    afx_msg void OnDestroy();                   // WM_DESTROY に対応
    DECLARE_MESSAGE_MAP()
};

/* メッセージマップの定義 */
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)    // 第1引数:メッセージマップを所有するクラスの名前、第2引数:基本クラス名
    ON_WM_PAINT()
    ON_WM_LBUTTONDOWN()
    ON_WM_CLOSE()
    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() のオーバーライド
{
    WNDCLASS    wc;

    if(!CFrameWnd::PreCreateWindow(cs))
        return FALSE;

    if(cs.hInstance) {
        // ウィンドウクラスの登録
        GetClassInfo(cs.hInstance, cs.lpszClass, &wc);
        wc.hIcon = LoadIcon(cs.hInstance, IDI_APPLICATION); // アイコン
        wc.lpszMenuName = MENU_NAME;                        // メニュー
        wc.lpszClassName = CLASS_NAME;                      // クラス名
        AfxRegisterClass(&wc);
        // CREATESTRUCT に値をセット(CreateWindowEx()の引数と同じ)
        cs.lpCreateParams   =   NULL;                       // Window 作成データのアドレス
    //  cs.hInstance        =   ;                           // インスタンスハンドル
        cs.hMenu            =   NULL;                       // メニューのハンドル
        cs.hwndParent       =   NULL;                       // 親Window のハンドル
        cs.cx               =   WIN_W;                      // Window の幅
        cs.cy               =   WIN_H;                      // Window の高
        cs.x                =   WIN_X;                      // Window の水平座標
        cs.y                =   WIN_Y;                      // Window の垂直座標
        cs.style            =   WS_OVERLAPPEDWINDOW;        // Window のスタイル
        cs.lpszName         =   WIN_TITLE;                  // Window 名(タイトルバーの文字)
        cs.lpszClass        =   CLASS_NAME;                 // クラス名
    //  cs.dwExStyle        =   ;                           // Window の拡張スタイル
    }

    return TRUE;
}

// メッセージハンドラ
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::OnLButtonDown(UINT wParam, CPoint pt)  // OnLButtonDown() のオーバーライド
{
    HWND        hWnd;
    HDC         hDC;

    hWnd = m_hWnd;
    hDC = ::GetDC(hWnd);
//  TextOut(hDC, LOWORD(lParam), HIWORD(lParam), "Hello World", 11);
    TextOut(hDC, pt.x, pt.y, "Hello World", 11);        // LOWORD(lParam) -> pt.x, HIWORD(lParam) -> pt.y
    ::ReleaseDC(hWnd, hDC);
    return;
}

void CMainFrame::OnClose()          // OnClose() のオーバーライド
{
    HWND    hWnd;
    int     ret;

    hWnd = m_hWnd;
    ret = ::MessageBox(hWnd, "プログラムを終了しますか", "確認", MB_YESNO | MB_ICONQUESTION);
    if(ret == IDYES)
        ::DestroyWindow(hWnd);
    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;



BACK  TOP