2013-11-04 31 views
1

我試圖對此進行研究,但我仍然很困惑。我真的不想使用全局變量,但即使在msdn網站上,他們也會說「將其設置爲全局,以便從對話框回調中訪問它」。有沒有辦法我可以在堆上創建內存並將指針傳遞給新創建的對話框?我希望對話框能夠更改通過指針訪問的數據。(Winapi C++)如何將數據從窗口傳遞到窗口而不使用全局變量?

+0

我認爲這雖然很長的數據是可能的,但... 你可能更好的想法重新考慮你的策略。在乞討中初始化對話框並提取結尾處的數據(DDT)是95%的情況下更好的方法 – gsf

+0

我該如何去做這件事?你的意思不是將指針傳遞給對話框,而是讓對話框編輯數據,在對話框中創建數據,並從對話框中獲取指針。 – JohnA

+0

從您提供的信息很難說。這個想法是相反的,你的對話框可以通過它的指針直接與模型(文檔)一起工作,內部模型可以臨時存儲數據。它會在那裏修改它,這將使您輕鬆取消選項。然後當對話完成時,您將把數據傳回模型。大多數UI框架爲此提供了基礎架構。 – gsf

回答

4

如果您正在使用的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); 
} 
+1

這是執行此操作的標準方法。 –

+0

而通常的C++技術是通過'this'作爲額外的參數。 – MSalters

0

您可以隨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; 
    } 
相關問題