Beispiel #1
0
// 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);
}
Beispiel #2
0
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);
        }
    }
}