TransWikia.com

Не работает override функции

Stack Overflow на русском Asked on November 25, 2021

Есть класс Window:

class Window {
private:
    static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
        Window* pThis = NULL;

        if (msg == WM_NCCREATE) {
            CREATESTRUCT* pCreate = (CREATESTRUCT*)lParam;
            pThis = (Window*)pCreate->lpCreateParams;
            SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)pThis);

            pThis->hWnd = hWnd;
        }
        else {
            pThis = (Window*)GetWindowLongPtr(hWnd, GWLP_USERDATA);
        }

        if (pThis) {
            return pThis->HandleMessage(msg, wParam, lParam);
        }
        else {
            return DefWindowProc(hWnd, msg, wParam, lParam);
        }
    }

    LRESULT CALLBACK HandleMessage(UINT msg, WPARAM wParam, LPARAM lParam) {
        switch (msg) {
            case WM_CREATE:
                return OnCreate() ? 0 : -1;

            case WM_PAINT:
                OnPaint();
                return 0;

            //....
    }

protected:
    HWND hWnd = NULL;
    MSG msg{};

    virtual bool OnCreate() { return true; }
    virtual void OnPaint() {}
    //...

public:
    Window(HINSTANCE hInstance, LPCWSTR className, LPCWSTR title, Rect rect) {
        WNDCLASSEX wnd{};

        wnd.lpszClassName = className;
        wnd.hInstance = hInstance;
        wnd.cbSize = sizeof(WNDCLASSEX);
        wnd.lpfnWndProc = WndProc;

        hWnd = CreateWindowEx(0, className, title,
                              WS_OVERLAPPEDWINDOW,
                              rect.x, rect.y,
                              rect.width, rect.height,
                              NULL, NULL, hInstance, this);
    }
    //...
};

и производный MainWindow:

class MainWindow : public Window {
private:
    //...

protected:
    virtual bool OnCreate() override {
        //...
    }

    virtual void OnPaint() override {
        //...
    }

public:
    //...
};

Я создаю объект класса MainWindow, но когда выполняется HandleMessage с параметром msg равным WM_CREATE и вызывается OnCreate, то вызывается метод не класса MainWindow, а базового класса Window. При этом если msg = WM_PAINT, то выполняется OnPaint класса MainWindow.

Как сделать так, чтобы вызывался OnCreate класса MainWindow?

One Answer

Решил проблему, вынеся создание окна из конструктора в отдельный метод

Answered by timur on November 25, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP