我正在编写一个(非托管)C++ 类来包装 Windows PropertySheet
。本质上,是这样的:
class PropSheet {
PROPSHEETHEADER d_header;
public:
PropSheet(/* parameters */);
INT_PTR show();
private:
static int CALLBACK *propSheetProc(HWND hwnd, UINT msg, LPARAM lParam);
};
构造函数只是初始化d_header
成员:
PropSheet::PropSheet(/* parameters */) {
d_header.dwSize = sizeof(PROPSHEETHEADER);
d_header.dwFlags = PSH_USECALLBACK;
// ...
d_header.pfnCallback = &propSheetProc;
// ...
}
之后,我可以以模态方式显示它:
INT_PTR PropSheet::show() {
return PropertySheet(&d_header);
}
现在的问题是,因为回调是静态的,所以它不能访问包装类。如果这是一个普通窗口,使用 aWindowProc
而不是 a ,我可以使用inPropSheetProc
将一些额外的数据附加到窗口,我可以在其中存储一个指向包装器的指针,就像在这篇文章中一样。但属性表不提供此功能。cbWndExtra
WNDCLASS
此外,因为属性表是模态显示的,所以我不能在实际窗口的创建和销毁之间执行任何代码,除非该代码是通过回调或表的窗口过程之一执行的。
到目前为止,我想出的最佳解决方案是,在显示属性表之前,将指向包装类的指针存储在全局变量中。但这假设我一次只显示一个属性表,无论如何都非常难看。
有谁知道如何解决这个问题?