(Winapi C++) 如何在没有全局变量的情况下将数据从一个窗口传递到另一个窗口?

Joh*_*hnA 2 c++ winapi

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

Cyc*_*ode 8

如果您使用的是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,你会送你的数据通过lpCreateParamsCREATESTRUCT通过发送存在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)

  • 这是执行此操作的标准方法。 (2认同)