C语言 如何在win32中创建相同对话过程的多个实例?



在非模态DialogBoxProcedure()中,我实现了两个主要函数:

  1. 使用SetWindowPos()沿着X轴和Y轴恒定移动,每次移动由计时器激活。(本质上是让对话框在屏幕上弹跳)。我通过使用静态int来设置变量,并在接收到新的计时器消息时相应地调整它们。

  2. 递归地通过调用CreateDialog()每当原始对话框收到适当的消息来创建一个新的对话框

我希望新的递归创建的对话框调用自己的DialogBoxProcedure与自己的一组静态变量,所以它可以独立移动,但最终发生的是新的对话框被堆叠在前面的对话框的顶部,可能是因为在DialogProcedure的静态变量的使用。有办法解决这个问题吗?

您不能为同一个对话过程创建多个实例。你可以多次使用同一个对话框过程,并确保它知道它在谈论哪个对话框。

将变量存储在某种结构中,并创建两个实例,例如使用malloc或仅使用两个不同的全局或静态变量。

:

  • 使用CreateDialogParam代替CreateDialog并给它一个指针:

    // instead of
    hWndDialog = CreateDialog(     hInstance, IDD_MY_DIALOG, hWndParent, MyDialogProc);
    // use:
    hWndDialog = CreateDialogParam(hInstance, IDD_MY_DIALOG, hWndParent, MyDialogProc, pMyDialogStruct1);
    //                       ^^^^^                                                     ^^^^^^^^^^^^^^^^
    
  • 当你的对话进程得到一个WM_INITDIALOG消息,该指针是在lParam。然后,您可以使用SetWindowLongPtr(DWLP_USER):

    将其传输到HWND。
    SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR)lParam);
    
  • 现在结构指针存储在HWND中,您可以随时取回它:

    MyDialogStruct* dlgStruct = (MyDialogStruct*)GetWindowLongPtr(hWnd, DWLP_USER);
    

最新更新