Я пишу (неуправляемый) класс C++ для обертывания Windows PropertySheet
. По сути, что-то вроде этого:Обтекание 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
вместо PropSheetProc
, я мог бы добавить некоторые дополнительные данные в окно, используя cbWndExtra
в WNDCLASS
, в котором я мог бы сохранить указатель обратно к обертке, например, в this article. Но листы свойств не предлагают эту функциональность.
Кроме того, поскольку лист свойств показан модально, я не могу выполнять код между созданием и уничтожением фактического окна, за исключением случаев, когда этот код выполняется через обратный вызов или одну из оконных процедур листа.
Лучшее решение, с которым я столкнулся, заключается в том, чтобы прямо перед отображением листа свойств хранить указатель на класс-оболочку внутри глобальной переменной. Но это предполагает, что я буду показывать только один лист свойств одновременно и в любом случае довольно уродлив.
Есть ли у кого-нибудь лучшее представление, как обойти это?
Увы, у него нет родителя. Кроме того, та же проблема возникла бы, если родительский породил несколько листов свойств.(Редкий, я знаю, но это может произойти.) – Thomas
Или вы предлагаете, чтобы я использовал 'PropSheet *' для 'HWND'? Разве это не заставит голову Windows взорваться, если она попытается получить доступ к 'HWND'? – Thomas
Я что-то не понимаю? Вы устанавливаете (или должны устанавливать) родительское окно на 'PROPSHEETHEADER' (т. Е.' HwndParent'). В 'PropSheetProc()' вы получаете дескриптор диалога в качестве первого параметра, на который вы можете вызвать 'GetParent()'. –