1日でわかるMFC (GARAさんのページ)
Sample_E 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 ファイル共通です)
/** 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