1日でわかるMFC (GARAさんのページ)
Sample_A 標準的なWindowsプログラム
プログラム概要
・ マウスで画面上を左クリックするとその位置に 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 ファイル共通です)
/** 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 ファイル共通です)
/** 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