|
ウィンドウクラスを構築する Part.2 |
| ダウンロード : ウィンドウクラス構築サンプル2(2006/03/25) |
|
// ------------------------------------------------------------------- // 識別子定義 // ------------------------------------------------------------------- #define PROP_WINPROC "PropClassWindowProc" // プロパティを識別する文字列 |
|
// ------------------------------------------------------------------- // CBaseWindow コンストラクタ // ------------------------------------------------------------------- // 〜 前略 〜 m_hWnd = CreateWindowEx( dwExStyle, // 拡張ウィンドウスタイル m_pszClassName, // ウィンドウ名 NULL, // キャプション dwStyle, // ウィンドウスタイル CW_USEDEFAULT, CW_USEDEFAULT, // 好きな位置に表示 CW_USEDEFAULT, CW_USEDEFAULT, // サイズ NULL, NULL, wc.hInstance, NULL // インスタンス指定 ); if (!m_hWnd) return; // オブジェクト(自分自身)のポインタを登録する ::SetProp(m_hWnd, PROP_WINPROC, this); // ←追加 ::ShowWindow(m_hWnd, SW_SHOWDEFAULT); ::UpdateWindow(m_hWnd); |
|
// ------------------------------------------------------------------- // [静的] ウィンドウプロシージャ // ------------------------------------------------------------------- LRESULT CALLBACK CBaseWindow::WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ){ // 必要不可欠なメッセージ処理をする switch (msg){ case WM_CLOSE: ::DestroyWindow(hWnd); return 0; case WM_DESTROY: // 関連付けを抹消する ::RemoveProp(hWnd, PROP_WINPROC); // ←追加 ::PostQuitMessage(0); return 0; } // 以下、新規追加 // 関連付けられたポインタを取り出す CBaseWindow* win = (CBaseWindow*)GetProp(hWnd, PROP_WINPROC); if (!win) return DefWindowProc(hWnd, msg, wParam, lParam); // インスタンス別ウィンドウプロシージャ処理を行う return win->WndProcLocal(hWnd, msg, wParam, lParam); } |
|
// ------------------------------------------------------------------- // インスタンス別ウィンドウプロシージャ ※新規追加 // ------------------------------------------------------------------- LRESULT CBaseWindow::WndProcLocal(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { // 個別のメッセージ処理を記述する return ::DefWindowProc(hWnd, msg, wParam, lParam); } |
|
// ------------------------------------------------------------------- // [派生] インスタンス別ウィンドウプロシージャ // ------------------------------------------------------------------- LRESULT CDerivedWindow::WndProcLocal( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ){ PAINTSTRUCT ps; // **2006/03/25バグ修正 switch (msg){ case WM_PAINT: { HDC hDC = ::BeginPaint(hWnd, &ps); // **2006/03/25バグ修正 // 〜 独自の処理 〜 ::EndPaint(hWnd, &ps); // **2006/03/25バグ修正 return 0; } } return CBaseWindow::WndProcLocal(hWnd, msg, wParam, lParam); } |