我试图对此进行研究,但我仍然很困惑。我真的不想使用全局变量,但即使在 msdn 站点上,他们也会说“将其设置为全局变量以从对话框回调中访问它”。有没有办法可以在堆上创建内存并将指针传递给新创建的对话框?我希望对话框能够更改通过指针访问的数据。
问问题
2799 次
2 回答
8
如果您使用的是,DialogBoxParam
您可以将指针传递给dwInitParam
:
DialogBoxParam(hInstance,
MAKEINTRESOURCE(IDD_DIALOG),
hwndParent,
YourDialogFunc,
dwInitParam);
然后你会从你的对话回调中访问数据:
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;
}
如果您使用 ,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);
}
于 2013-11-04T03:50:52.460 回答
1
您始终可以使用带有 WM_USER(或任何消息值 >= WM_USER)的“PostMessage”在窗口之间发送自定义数据。(SendWindow 也可以工作,但它将具有同步行为并阻塞,直到接收窗口消费完消息)。
正如其他人在您的帖子的评论和其他答案中暗示的那样,可能有更好的方法来完成您真正想做的事情。如果你只想将一些数据或数据对象与窗口句柄相关联,那么 Krister 提出的 GWLP_USERDATA 解决方案是标准的。
通常,具有自定义消息类型和数据的 PostMessage/SendMessage 用于从另一个线程或非 UI 组件发出信号。
但这里有一些代码来回答你原来的问题:
// sending window calls this
BYTE* data = malloc(DATA_BLOCK_SIZE);
// not shown - initialize "data"
PostMessage(hwndOtherDialog, WM_USER, 0, (LPARAM)data);
要接收它,该窗口的 WndProc(或 DlgProc)将按如下方式获取它:
LRESULT __stdcall WndProcOtherWindow(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
case WM_USER:
{
BYTE* data = (BYTE*)lParam;
// not shown - process data
free(data);
return 0;
}
于 2013-11-04T06:44:48.743 回答