Windows를 랩핑하기 위해 (관리되지 않는) C++ 클래스를 작성하고 있습니다. PropertySheet
. 기본적으로,이 같은 일이 :와, 모달, 나는 그것을 보여줄 수PropertySheet 배치; 콜백을 처리하는 방법?
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);
}
지금 문제가
는class PropSheet {
PROPSHEETHEADER d_header;
public:
PropSheet(/* parameters */);
INT_PTR show();
private:
static int CALLBACK *propSheetProc(HWND hwnd, UINT msg, LPARAM lParam);
};
생성자는 단지 d_header
멤버를 초기화 콜백은 정적이므로 래퍼 클래스에 액세스 할 수 없습니다. 정상적인 창일 경우 PropSheetProc
대신 WindowProc
이 표시되고 cbWndExtra
을 WNDCLASS
에 사용하여 창에 추가 데이터를 첨부 할 수 있습니다. 여기에서 this article처럼 포인터를 래퍼에 다시 저장할 수 있습니다. 그러나 속성 시트는이 기능을 제공하지 않습니다.
또한 속성 시트가 모달로 표시되기 때문에 콜백 또는 시트의 윈도우 프로 시저 중 하나를 통해 코드가 실행되는 경우를 제외하고는 실제 윈도우의 생성과 삭제 사이에 아무 코드도 실행할 수 없습니다.
필자가 지금까지 해왔 던 최상의 솔루션은 속성 시트를 표시하기 전에 전역 변수 내에서 래퍼 클래스에 대한 포인터를 저장하는 것입니다. 그러나 이것은 한 번에 하나의 속성 시트 만 보여줄 것이라고 가정하고 어쨌든 꽤 추합니다.
이 문제를 해결하는 방법에 대해 더 잘 알고있는 사람이 있습니까? 당신은 속성 시트의 모달을 보이고있다으로
아아, 부모가 없습니다. 또한 부모가 여러 속성 시트를 생성 한 경우에도 동일한 문제가 발생합니다.(희귀하다, 나도 알지만, 일어날 수있다.) – Thomas
아니면'PropSheet * '를'HWND'에 던지라고 제안하고 있는가? 'HWND'에 접근하려고하면 윈도우의 폭발이 일어나지 않을까? – Thomas
여기에 오해가 있습니까? 'PROPSHEETHEADER' (즉,'hwndParent')에 부모 윈도우를 설정 (또는 설정해야합니다)합니다. 'PropSheetProc()'에서 당신은'GetParent()'를 호출 할 수있는 첫 번째 매개 변수로서 대화 상자의 핸들을 얻습니다. –