我試圖對此進行研究,但我仍然很困惑。我真的不想使用全局變量,但即使在msdn網站上,他們也會說「將其設置爲全局,以便從對話框回調中訪問它」。有沒有辦法我可以在堆上創建內存並將指針傳遞給新創建的對話框?我希望對話框能夠更改通過指針訪問的數據。(Winapi C++)如何將數據從窗口傳遞到窗口而不使用全局變量?
回答
如果您正在使用的DialogBoxParam
你可以通過在dwInitParam
指針:如果您使用CreateWindowEx
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;
}
:
DialogBoxParam(hInstance,
MAKEINTRESOURCE(IDD_DIALOG),
hwndParent,
YourDialogFunc,
dwInitParam);
那麼你會從你的對話框回調訪問數據您將通過發送lpParam
參數的CREATESTRUCT
中的lpCreateParams
向您發送數據。
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);
}
這是執行此操作的標準方法。 –
而通常的C++技術是通過'this'作爲額外的參數。 – MSalters
您可以隨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;
}
- 1. 如何將數據從父窗口傳遞到彈出窗口
- 2. 將變量從窗口傳遞到窗口
- 3. 將PHP窗體數據從子窗口傳遞到父窗口
- 4. 如何將數據從父窗口傳遞給子窗口?
- 5. 如何將數據從彈出窗口傳遞給父窗口?
- 6. PHP將數據從子窗口傳遞到父窗口
- 7. 如何將數據從一個窗口傳遞到另一個窗口?
- 8. JavaScript將數據從子窗口傳遞給父窗口,IE bug?
- 9. 將變量從一個模態窗口傳遞到另一個模態窗口
- 10. C++ WINAPI窗口不刷新
- 11. WINAPI C++窗口不低於
- 12. 將窗口句柄傳遞給變量
- 13. 從父窗口Javascript函數傳遞變量到彈出窗口Div
- 14. 鈦 - 傳遞變量到新窗口
- 15. 爲什麼傳輸全局窗口參數如果是全局窗口參數
- 16. 在全局窗口之間傳遞值
- 17. 如何將一個變量值從父窗口傳遞到html中使用javascript的新子窗口
- 18. 如何將數據從父頁面傳遞到彈出窗口?
- 19. 將消息從一個窗口傳遞到另一個窗口
- 20. 將輸入值從父窗口傳遞到彈出窗口
- 21. 創建子窗口並將數據從其傳遞到父窗口
- 22. 2個窗口需要全局變量
- 23. 傳遞數組到窗口
- 24. 如何將郵件從Safari擴展彈出窗口傳遞到全局頁面?
- 25. C# - WPF中從子窗口到父窗口的返回變量
- 26. 如何使用Javascript和/或JSP將數據從子窗口傳遞到父窗口
- 27. 如何將DOM數據從一個窗口傳輸到另一個窗口?
- 28. 確定窗口是否已經加載而不使用任何全局變量
- 29. 如何將控制值從父窗口傳遞到彈出窗口的代碼
- 30. C++ winapi通過鼠標點擊子窗口到父窗口
我認爲這雖然很長的數據是可能的,但... 你可能更好的想法重新考慮你的策略。在乞討中初始化對話框並提取結尾處的數據(DDT)是95%的情況下更好的方法 – gsf
我該如何去做這件事?你的意思不是將指針傳遞給對話框,而是讓對話框編輯數據,在對話框中創建數據,並從對話框中獲取指針。 – JohnA
從您提供的信息很難說。這個想法是相反的,你的對話框可以通過它的指針直接與模型(文檔)一起工作,內部模型可以臨時存儲數據。它會在那裏修改它,這將使您輕鬆取消選項。然後當對話完成時,您將把數據傳回模型。大多數UI框架爲此提供了基礎架構。 – gsf