Я разрабатываю программу, которая отображает графические окна, используя Windows API.Ниже приведена функция, которую я предоставил как WndProc при регистрации класса окна - это статическая функция внутри класса WindowsWindow
.
#define BTK_DLL_FUNC __dllspec(dllexport)
class AbstractBackend
{
protected:
bool FatalWarnings;
public:
AbstractBackend (bool FatalWarnings=false);
~AbstractBackend ();
virtual void StartMainLoop () = 0;
virtual void QuitMainLoop () = 0;
};
class WindowsBackend : public Base::AbstractBackend
{
public:
static HINSTANCE hinstance;
static WindowsBackend* instance;
public:
BTK_DLL_FUNC WindowsBackend ();
BTK_DLL_FUNC ~WindowsBackend ();
BTK_DLL_FUNC void StartMainLoop ();
BTK_DLL_FUNC void QuitMainLoop ();
};
void WindowsBackend::StartMainLoop ()
{
MSG Msg;
while (GetMessage (&Msg, NULL, 0, 0) > 0)
{
TranslateMessage (&Msg);
DispatchMessage (&Msg);
}
}
void WindowsBackend::QuitMainLoop ()
{
PostQuitMessage (0); /* Send a WM_QUIT message, to stop the main loop */
}
LRESULT CALLBACK WindowsWindow::WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CREATE:
break;
case WM_CLOSE:
DestroyWindow (hwnd);
break;
case WM_DESTROY: /* The window was destroyed */
{
WindowsBackend::instance->QuitMainLoop (); /* This doesn't work! */
break;
}
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
Теперь вот часть, которую я не понимаю - QuitMainLoop не делаетне начинается и не возвращается (я попробовал отладчик, и он показал, что функция Quit не вызывается, а также что ни одна строка после этого вызова не выполняется).Практически моя программа застревает после этого вызова.
Но замена вызова пользовательской функции выхода на прямой вызов PostQuitMessage
работает.
Любые объяснения и / или способобойти это (и иметь возможность вызывать виртуальную функцию) будет очень полезно.
Редактировать: Добавлен точный код