1日でわかるMFC (GARAさんのページ)
BACK  
 Sample_E CALLBACK 関数をクラスのメンバ関数にする

Sample_E1.cpp はメインウィンドウをクラス化し CALLBACK 関数をそのメンバにしています。

プログラム概要
・ タイマを使用して現在時刻とプログラム起動からの経過時間を画面に表示します。
・ CALLBACK 関数をクラスのメンバ関数にしています。
・ CALLBACK 関数内でメンバ変数を参照しています(静的メンバ関数内から静的メンバ変数を参照)



ヘッダファイル
Sample_E.h
#define MENU_NAME   NULL        // メニュー名
#define WIN_W       300         // Window の幅
#define WIN_H       140         // Window の高
#define WIN_X       400         // Window の水平座標
#define WIN_Y       50          // Window の垂直座標
#define TIMER_ID    100         // タイマーID

 Sample_E1.cpp CALLBACK 関数をウィンドウクラスのメンバ化 (緑色の部分は各 .cpp ファイル共通です)
TOP  
/** Sample_E1.cpp:CALLBACK 関数を使用したWindowsプログラム (by GARA) **/

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

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

/* ウィンドウクラスの宣言 */
class CMainFrame : public CFrameWnd     // ウィンドウクラス CWnd -> CFrameWnd
{
    // メンバ変数
    static char     StartMsg[];         // 静的メンバ変数宣言
    static int      StartHH;            // 静的メンバ変数宣言
    static int      StartMM;            // 静的メンバ変数宣言
    static int      StartSS;            // 静的メンバ変数宣言
public:
    // コンストラクタ
    CMainFrame();
    // メンバ関数
    virtual BOOL PreCreateWindow(CREATESTRUCT&);
    static void CALLBACK TimerProc(HWND, UINT, WPARAM, LPARAM);     // 頭に static が必要。ないとコンパイルエラー(C2440)
    // メッセージハンドラ
    afx_msg int  OnCreate(LPCREATESTRUCT);      // WM_CREATE に対応
    afx_msg void OnPaint();                     // WM_PAINT に対応
    afx_msg void OnDestroy();                   // WM_DESTROY に対応
    DECLARE_MESSAGE_MAP()
};

/* メッセージマップの定義 */
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)    // 第1引数:メッセージマップを所有するクラスの名前、第2引数:基本クラス名
    ON_WM_CREATE()
    ON_WM_PAINT()
    ON_WM_DESTROY()
END_MESSAGE_MAP()

/* アプリケーションクラスの宣言 */
class CMyApp : public CWinApp
{
public:
    virtual BOOL InitInstance();        // インスタンスを初期化する関数
};

/* ウィンドウクラスのメンバ */
// 静的メンバ変数
char CMainFrame::StartMsg[80] = "";     // 静的メンバ変数の定義と初期化
int  CMainFrame::StartHH = 0;
int  CMainFrame::StartMM = 0;
int  CMainFrame::StartSS = 0;

// コンストラクタ
CMainFrame::CMainFrame()                // コンストラクタ
{
    Create(NULL, "");                   // ウィンドウの作成。第1引数:クラス名、第2引数:ウィンドウ名
}

// メンバ関数
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)  // PreCreateWindow() のオーバーライド
{
    Sample_A2.cpp と同じ 
}

// メッセージハンドラ
int CMainFrame::OnCreate(LPCREATESTRUCT cs)
{
    SYSTEMTIME  st;

    SetTimer(TIMER_ID, 100, (TIMERPROC)TimerProc);      // CWnd のメンバ関数
    GetLocalTime(&st);                                  // システムタイムを取得
    wsprintf(StartMsg, "Start Time : %02d/%02d %02d:%02d:%02d",
                                        st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
    StartHH = st.wHour;
    StartMM = st.wMinute;
    StartSS = st.wSecond;
    return 0;
}

void CMainFrame::OnPaint()          // OnPaint() のオーバーライド
{
    CPaintDC    dc(this);   // CPaintDC のコンストラクタの引数に this(CMainFrame オブジェクトへのポインタ)をセット

    dc.TextOut(10, 10, "SDK -> MFC", 10);
    dc.TextOut(10, 30, StartMsg, lstrlen(StartMsg));
    return;
}

void CMainFrame::OnDestroy()        // OnDestroy() のオーバーライド
{
    KillTimer(TIMER_ID);            // CWnd のメンバ関数
    PostQuitMessage(0);
    return;
}

/* タイマープロシージャ */
void CALLBACK CMainFrame::TimerProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC         hDC;
    SYSTEMTIME  st;
    char        WkBuf[80];
    int         hh, mm, ss;

    GetLocalTime(&st);                  // システムタイムを取得
    hDC = ::GetDC(hWnd);
    wsprintf(WkBuf, "現在の時刻:%02d:%02d:%02d", st.wHour, st.wMinute, st.wSecond);
    TextOut(hDC, 44, 55, WkBuf, strlen(WkBuf));
    hh = st.wHour - StartHH;            // StartHH は静的メンバ変数
    mm = st.wMinute - StartMM;          // StartMM は静的メンバ変数
    ss = st.wSecond - StartSS;          // StartSS は静的メンバ変数
    if(ss < 0) {
        ss += 60;
        mm --;
    }
    if(mm < 0) {
        mm += 60;
        hh --;
    }
    if(hh < 0)
        hh += 24;
    wsprintf(WkBuf, "経過時間:   %5d 秒", 3600 * hh + 60 * mm + ss);
    TextOut(hDC, 44, 75, WkBuf, strlen(WkBuf));
    ::ReleaseDC(hWnd, hDC);
    return;
}

/* アプリケーションクラスのメンバ */
// メンバ関数
BOOL CMyApp::InitInstance()         // InitInstance() のオーバーライド
{
    m_pMainWnd = new CMainFrame();          // メインウィンドウの作成
    m_pMainWnd->ShowWindow(m_nCmdShow);
    m_pMainWnd->UpdateWindow();

    return TRUE;
}


/* アプリケーションの生成(実行)*/

CMyApp MyApp;



BACK  TOP