Ich schreibe eine Win32 Wrapper-Klassen, vor allem, um mehr über Win32-Programmierung zu lernen. Um das Problem der c-style Rückrufe zu umgehen, speichert/ruft die folgende Methode den Zeiger mit SetWindowLong/GetWindowLong und übergibt es an die tatsächliche winproc.Win32: Modal Dialog nicht zurück Fokus
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 ist die Klasse, die das von CreateWindowEx erstellte Hauptfenster einhüllt. Die gleiche WindowProc-Funktion ist Teil der MDlgClass, die den modalen Dialog einhüllt. Ich bin den Dialog wie dieser
DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(id), hwnd, DialogProc);
Aufruf Wenn ich übergeben NULL als hWndParent, funktioniert der Dialog in Ordnung als modalen Dialog, aber wenn ich Hwnd passieren, wobei der Griff in das Hauptfenster als hWndParent der Dialog funktioniert ordnungsgemäß als ein modaler Dialog Aber wenn ich den Dialog schließe, übergibt er die Kontrolle nicht zurück an das Haupt-Eltern-Fenster? Das Debuggen in Visual Studio zeigt, dass es in der Nachrichtenpumpe in WinMain hängt.
Ich dachte an eine hashmap, um die Zeiger abzubilden, aber ich würde es lieber mit GetWindowLong etc. machen. Ist das möglich? Ich habe versucht, den Dialogzeiger in DWL_USER zu speichern, aber es hilft nicht.
Jede Hilfe würde geschätzt werden, ich bin immer noch um Win32.
EDIT: Ich Zerstören den Dialog EndDialog Verwendung
EDIT: Ich Speichere die Zeiger in dem GWL_USERDATA Bereich des Hauptfensters, die nicht durch Fenster verwendet wird, und ich bin Modifizieren nur in WinClass :: WindowProc, wenn das Fenster zum ersten Mal erstellt wird. Wenn ich eine Dialogklasse nicht instanziiere, weiß ich, dass auf den Zeiger korrekt zugegriffen wird, da die Anwendung auf Menübefehle reagiert, die über WindowProc und WM_COMMAND verarbeitet werden.