【发布时间】:2010-10-29 17:55:26
【问题描述】:
我正在编写一个win32 wrapper classes,主要是为了学习更多关于win32 编程的知识。 为了解决 c 样式回调的问题,以下方法使用 SetWindowLong/GetWindowLong 存储/检索指针并将其传递给实际的 winproc。
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。
编辑:我正在使用 EndDialog 销毁对话框
编辑:我将指针存储在主窗口的 GWL_USERDATA 区域中,Windows 不使用该区域,并且仅在首次创建窗口时在 WinClass::WindowProc 中对其进行修改。如果我不实例化对话框类,我知道指针被正确访问,因为应用程序响应通过 WindowProc 和 WM_COMMAND 处理的菜单命令。
【问题讨论】: