2013-03-08 77 views
1

在WINAPI中,这是正确的还是必要的?子类化控制

SetWindowLongPtr(HelpBox, GWLP_USERDATA, static_cast<LONG_PTR>(SetWindowLongPtr(HelpBox, GWLP_WNDPROC, (LONG_PTR)(Subclass)))); 

OR

SetWindowLongPtr(HelpBox, GWLP_WNDPROC, (LONG_PTR)(Subclass)); 
在WM_DESTROY

话,我都喜欢:

SetWindowLong(HelpBox, GWLP_WNDPROC, (LONG) Original); 

我为什么要使用在第二的第一个?我注意到它有两次GWLP_USERDATA和setwindowlongptr ..为什么?我在MSDN上看到了两个例子,我不知道什么时候使用第一个。

任何想法?

回答

2

使用SetWindowSubclass改为;它处理了与窗口关联数据的负担。无论如何。第一个将旧窗口proc地址存储在与窗口关联的用户数据存储中,除非窗口类是您自己定义的窗口类,否则不能这样做。即,其中这样的存储确实存在于窗口,其中保证该存储不被用于其他任何事情。

+0

呃,抱歉编辑。我将自定义用户数据存储的非负索引与“GWLP_USERDATA”混合在一起,这是一个单独的项目存储并且始终存在。但同样的警告适用。需要完全控制才能使用它。 – 2013-03-08 23:50:19

+0

你能告诉我什么是SetWindowSubclass的最后两个参数吗?我为什么需要它们?我正在写一个课程来制作窗口,如果需要的话,我不想跟踪所有的ID。 http://pastebin.com/ePbbM57x < - 就像那样。我是否必须跟踪每个子类的全局ID?如果两个ID相同会发生什么? – Brandon 2013-03-08 23:54:51

+0

@CantChooseUsernames:该id用于删除子类(通常您会在收到'WM_DESTROY'时执行此操作)。由于删除函数将窗口句柄作为参数,以及子类的窗口过程地址,因此您可以选择一个常量标识,例如0或1 :-)。唯一的例外是我可以想到的是,当代码是这样的,使用相同的子类窗口过程对相同的窗口进行两次或更多子类化时,可以发生,然后该ID至少原则上允许适当的顺序无关清理 – 2013-03-09 00:12:43