2013-02-14 86 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是向类/窗口数据“向后”的负偏移量。它是这种目的的保留空间,但它只能适合一个指针值的数据。