2

我试图对此进行研究,但我仍然很困惑。我真的不想使用全局变量,但即使在 msdn 站点上,他们也会说“将其设置为全局变量以从对话框回调中访问它”。有没有办法可以在堆上创建内存并将指针传递给新创建的对话框?我希望对话框能够更改通过指针访问的数据。

4

2 回答 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的数据。CREATESTRUCTlpParam

 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 回答