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?
Решил проблему, вынеся создание окна из конструктора в отдельный метод
Answered by timur on November 25, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP