我试图对此进行研究,但我仍然很困惑。我真的不想使用全局变量,但即使在 msdn 站点上,他们也说“将其设置为全局以从对话框回调中访问它”。有什么办法可以在堆上创建内存并将指针传递给新创建的对话框吗?我希望对话框能够更改通过指针访问的数据。
如果您使用的是DialogBoxParam,则可以在 中传递指针dwInitParam:
DialogBoxParam(hInstance,
MAKEINTRESOURCE(IDD_DIALOG),
hwndParent,
YourDialogFunc,
dwInitParam);
Run Code Online (Sandbox Code Playgroud)
然后,您将从对话框回调中访问数据:
INT_PTR CALLBACK YourDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch(uMsg) [
case WM_INITDIALOG:
// the lParam parameter will contain the data sent through the dwInitParam
return 1;
break;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果你使用CreateWindowEx,你会送你的数据通过lpCreateParams在CREATESTRUCT通过发送存在lpParam参数。
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch(uMsg) [
case WM_CREATE:
{
CREATESTRUCT *pCreate = reinterpret_cast<CREATESTRUCT*>(lParam);
int* userdata = reinterpret_cast<int*>(pCreate->lpCreateParams);
// store the pointer in the instance data of the window
// so it could always be retrieved by using GetWindowLongPtr(hwnd, GWLP_USERDATA)
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)userdata);
}
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)