Я пишу классы оболочки win32, в основном, чтобы узнать больше о программировании win32. Чтобы обойти проблему обратных вызовов c-стиля, следующий способ хранит/извлекает указатель с помощью SetWindowLong/GetWindowLong и передает его фактическому winproc.Win32: Модальный диалог, не возвращающий фокус
LRESULT CALLBACK WinClass::WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// On window creation, WindowProc receives lParam as a LPCREATESTRUCT
// Store *this* pointer as long in GWL_USERDATA
if (msg == WM_NCCREATE)
::SetWindowLong(hwnd, GWL_USERDATA, reinterpret_cast<long>(reinterpret_cast<LPCREATESTRUCT>(lParam)->lpCreateParams));
// Retrieve the pointer
WinClass *wnd = reinterpret_cast<WinClass*>(::GetWindowLongPtr(hwnd, GWL_USERDATA));
// Call the actual winproc function
if (wnd)
return wnd->WndProc(hwnd, msg, wParam, lParam);
// Default to DefWindowProc message handler function
return ::DefWindowProc(hwnd, msg, wParam, lParam);
}
Winclass класс обвести главное окно, созданное CreateWindowEx. Одна и та же функция WindowProc является частью MDlgClass, обертывающей модальный диалог. Я вызываю диалоговое окно, как этот
DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(id), hwnd, DialogProc);
Если я передаю NULL как hWndParent, диалог работает нормально, как немодальной диалог, но если я прохожу HWND, дескриптор главного окна, как hWndParent диалог работает правильно, как модальный диалог. Однако, когда я закрываю диалог, он не передает управление обратно в основное родительское окно? Отладка в Visual Studio показывает его зависание в насосе сообщений в WinMain.
Я думал об использовании хэш-карты для отображения указателей, но я бы предпочел сделать это с помощью GetWindowLong и т. Д. Возможно ли это? Я попытался сохранить указатель диалога в DWL_USER, но он не помогает.
Любая помощь будет оценена по достоинству, я все еще получаю голову вокруг Win32.
EDIT: Я разрушив диалог, используя EndDialog
EDIT: Я хранить указатель в GWL_USERDATA области главного окна, которое не используется окон, и я только изменить его в WinClass :: WindowProc при первом создании окна. Если я не создаю экземпляр класса диалога, я знаю, что указатель обращается правильно, так как приложение отвечает на команды меню, обработанные через WindowProc и WM_COMMAND.