// UWnd 静的ウィンドウプロシージャ inline LRESULT CALLBACK tapetums::UWnd::WndMapProc ( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ) { UWnd* wnd; // UWndオブジェクトのポインタを取得 if ( msg == WM_NCCREATE ) { wnd = (UWnd*)((CREATESTRUCT*)lp)->lpCreateParams; ::SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)wnd); } else { wnd = (UWnd*)::GetWindowLongPtr(hwnd, GWLP_USERDATA); } // まだマップされていない場合はデフォルトプロシージャに投げる if ( nullptr == wnd ) { return ::DefWindowProc(hwnd, msg, wp, lp); } // メンバ変数に情報を保存 switch ( msg ) { case WM_CREATE: { wnd->m_hwnd = hwnd; // ウィンドウハンドル break; } case WM_MOVE: { wnd->m_x = GET_X_LPARAM(lp); // ウィンドウX座標 wnd->m_y = GET_Y_LPARAM(lp); // ウィンドウY座標 break; } case WM_SIZE: { wnd->m_w = LOWORD(lp); // ウィンドウ幅 wnd->m_h = HIWORD(lp); // ウィンドウ高 break; } default: { break; } } // ウィンドウプロシージャの呼び出し return wnd->WndProc(hwnd, msg, wp, lp); }
void __stdcall UWnd::Register() const { // ウィンドウクラスを登録 WNDCLASSEX wc = { }; wc.cbSize = sizeof(wc); wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = ::GetModuleHandle(nullptr); wc.hIcon = nullptr; wc.hCursor = ::LoadCursor(nullptr, IDC_ARROW); wc.hbrBackground = nullptr; wc.lpszMenuName = nullptr; wc.lpszClassName = m_classname; wc.hIconSm = nullptr; wc.lpfnWndProc = [](HWND hwnd, UINT uMsg, WPARAM wp, LPARAM lp) -> LRESULT { UWnd* wnd = nullptr; // UWndオブジェクトのポインタを取得 if ( uMsg == WM_NCCREATE ) { wnd = (UWnd*)((CREATESTRUCT*)lp)->lpCreateParams; ::SetWindowLongPtrW(hwnd, GWLP_USERDATA, (LONG_PTR)wnd); } else { wnd = (UWnd*)::GetWindowLongPtrW(hwnd, GWLP_USERDATA); } // ウィンドウプロシージャの呼び出し if ( nullptr == wnd ) { console_out(TEXT("Call DefWindowProc(0x%04x)"), uMsg); return ::DefWindowProc(hwnd, uMsg, wp, lp); } else { // メンバ変数に情報を保存 switch ( uMsg ) { case WM_CREATE: { wnd->m_hwnd = hwnd; // ウィンドウハンドル //console_out(TEXT("Window Handle: 0x%p"), hwnd); break; } case WM_MOVE: { if ( wnd->m_is_fullscreen ) { break; } wnd->m_x = LOWORD(lp); // ウィンドウx座標 wnd->m_y = HIWORD(lp); // ウィンドウy座標 ::GetWindowRect(hwnd, &wnd->m_win_rect); //console_out(TEXT("(X, Y) = (%d, %d)"), wnd->m_x, wnd->m_y); break; } case WM_SIZE: { if ( wnd->m_is_fullscreen || wp != SIZE_RESTORED ) { break; } wnd->m_w = LOWORD(lp); // ウィンドウ幅 wnd->m_h = HIWORD(lp); // ウィンドウ高 ::GetWindowRect(hwnd, &wnd->m_win_rect); //console_out(TEXT("(Width, Height) = (%d, %d)"), wnd->m_w, wnd->m_h); break; } default: { break; } } return wnd->WndProc(hwnd, uMsg, wp, lp); } }; const auto atom = ::RegisterClassEx(&wc); if ( atom ) { console_out(TEXT("Registered window class: \"%s\""), m_classname); } else { if ( GetLastError() == 0x582 ) { // そのクラスは既にあります。 } else { // エラーメッセージの表示 ShowLastError(m_classname); } } }