簡體   English   中英

如何在 win32 中創建同一個對話過程的多個實例?

[英]How to create multiple instances of the same Dialog Procedure in win32?

在無模式 DialogBoxProcedure() 中,我實現了兩個主要功能:

  1. 使用 SetWindowPos() 沿 X 和 Y 軸持續移動,每次移動均由計時器激活。 (實質上是使對話框在屏幕上彈跳)。 我通過使用 static int 來設置變量,並在收到新的計時器消息時相應地調整它們來做到這一點。

  2. 每當原始對話框收到適當的消息時,通過調用 CreateDialog() 遞歸地創建一個新的對話框。

我希望新的遞歸創建的對話框使用自己的一組 static 變量調用自己的 DialogBoxProcedure,以便它可以獨立移動,但最終發生的是新的 DialogBox 恰好堆疊在前一個對話框的頂部,可能是因為DialogProcedure 中 static 個變量的使用。 有沒有辦法來解決這個問題?

您不能創建同一對話過程的多個實例。 您可以多次使用同一個對話過程,並確保它知道它在談論哪個對話。

將變量存儲在某種結構中並為其創建兩個實例,例如使用malloc或僅使用兩個不同的全局變量或 static 變量。

然后:

  • 而不是 CreateDialog 使用CreateDialogParam並給它一個指針:

     // 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM