2013-02-14 88 views
1

我有一個類表示一個文本框,在類的構造函數中我調用了CreateWindow函數,並且我想存儲額外的窗口內存中的指針對象,所以在WndProc函數中我會得到指針,並且會使用類成員。
我想這樣做與此代碼,但它不工作,能有人來寫一個例子如何做到這一點:示例將指針存儲在窗口類的額外窗口內存中

  • 我應該給在WNDCLASSEX結構cbWndExtra成員什麼樣的價值。
  • 如何調用SetWindowLong
  • 如何調用GetWindowLong

代碼中,我寫道:

wcex.cbWndExtra = 4; 

,我在文本框中類的構造函數寫了這個:

hWnd = CreateWindow(...); 
    SetWindowLong(hWnd,0,(LONG)this); 

WndProc功能,這

unique_ptr<TextBox> pTextBox; 
    pTextBox.reset((TextBox*)GetWindowLong(hWnd,0)); 

===編輯===

現在我明白,如果我更改WndProc功能的代碼,這段代碼:

TextBox *pTextBox; 
pTextBox = (TextBox*)GetWindowLong(hWnd,0); 

它的工作爲好,但它unique_ptr不工作。

+1

「它不工作」是什麼意思? – 2013-02-14 20:37:04

+2

請注意SetWindowLong只存儲一個長而不是指針。在64位平臺上,這些不一樣。 – 2013-02-14 20:38:44

+0

@Robert - 我沒有得到這個類的對象,jast新對象。 – user1544067 2013-02-14 20:38:56

回答

0
SetWindowLong(hWnd,0,(LONG)this); 

這裏的值0沒有意義。您必須使用其中一個GWL_XXXX常量來指示您要設置的值。用於存儲任意數據的是GWL_USERDATA。

通過不忽略錯誤檢查進一步改進您的代碼,它可以讓您儘早診斷此錯誤。這是一個有點尷尬了此功能,它需要像這樣:

SetLastError(0); 
LONG retval = SetWindowLong(hWnd, GWL_USERDATA, (LONG)this); 
if (retval == 0) { 
    int err = GetLastError(); 
    if (err) CallNineOneOne(err); 
} 
+1

該函數可以像GWL_USERDATA一樣使用0,並查看我對問題的編輯。 – user1544067 2013-02-14 22:15:12

+0

http://en.wikipedia.org/wiki/Occam%27s_razor – 2013-02-14 22:26:21

0

從對「SetWindowLong函數」,MSDN文檔有關「索引」的參數。

要設置的值的從零開始的偏移量。有效值的範圍爲零到額外窗口內存的字節數減去整數的大小。要設置任何其他值,請指定以下值之一。

正偏移量可以指向任何字節偏移量,只要您在WNDCLASS結構中創建了至少具有該量「cbWndExtra」的窗口即可。

我懷疑這種情況下的問題可能與指針的大小有關。您明確地將4個額外的字節分配給窗口結構的末尾,但是如果您在64位系統上,則指針大小將爲8.這可以解釋它有時可以工作,有時不可以。 (如果高位字恰好全是零,即使地址被截斷,它也可能工作。) 如果是這種情況,您需要在兩個不同的調用中設置高位和低位字,或者最好使用64位變量「SetWindowLongPtr」。

下面是一個使用此功能,兩個指針存儲在窗口額外的數據區域(注意以下將與32位和64位工作)

wndclass.cbWndExtra = sizeof(char*) * 2; // Reserve space for 2 pointers. 

再後來設定值,用一個簡單的例子:

SetWindowLongPtr(hwnd, 0, (LONG_PTR)firstPtr); 
SetWindowLongPtr(hwnd, sizeof(char*), (LONG_PTR)secondPtr); // Index is byte offset. 

和檢索值:

LONG_PTR firstPtr = GetWindowLongPtr(hwnd, 0); 
LONG_PTR secondPtr = GetWindowLongPtr(hwnd, sizeof(char*)); 

如果你只需要發但是,你可以避免設置任何額外的內存,將cbWndExtra保持爲零,並且僅僅傳遞GWLP_USERDATA作爲索引。像其他預定義的值一樣,GWLP_USERDATA是向類/窗口數據「向後」的負偏移量。它是這種目的的保留空間,但它只能適合一個指針值的數據。