在非模态DialogBoxProcedure()中,我实现了两个主要函数:
-
使用SetWindowPos()沿着X轴和Y轴恒定移动,每次移动由计时器激活。(本质上是让对话框在屏幕上弹跳)。我通过使用静态int来设置变量,并在接收到新的计时器消息时相应地调整它们。
-
递归地通过调用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); // ^^^^^ ^^^^^^^^^^^^^^^^
-
当你的对话进程得到一个
将其传输到HWND。WM_INITDIALOG
消息,该指针是在lParam
。然后,您可以使用SetWindowLongPtr(DWLP_USER):SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR)lParam);
-
现在结构指针存储在HWND中,您可以随时取回它:
MyDialogStruct* dlgStruct = (MyDialogStruct*)GetWindowLongPtr(hWnd, DWLP_USER);