Windows をラップする (アンマネージ) C++ クラスを作成しています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);
}
問題は、コールバックが静的であるため、ラッパー クラスにアクセスできないことです。これが通常のウィンドウで、 のWindowProc
代わりに を使用している場合、 in を使用しPropSheetProc
てウィンドウに追加データを追加できます。この記事のように、ポインターをラッパーに戻すことができます。ただし、プロパティ シートにはこの機能はありません。cbWndExtra
WNDCLASS
さらに、プロパティ シートはモーダルに表示されるため、コールバックまたはシートのウィンドウ プロシージャの 1 つを介してコードが実行される場合を除いて、実際のウィンドウの作成と破棄の間にコードを実行することはできません。
これまでに思いついた最善の解決策は、プロパティ シートを表示する直前に、ラッパー クラスへのポインターをグローバル変数内に格納することです。しかし、これは、一度に 1 つのプロパティ シートしか表示しないことを前提としており、いずれにしても非常に見苦しいものです。
これを回避する方法を知っている人はいますか?