Самоуничтожающийся класс, содержащий окно - PullRequest
0 голосов
/ 02 октября 2011

Я создал класс предварительного просмотра печати, PPREVIEW, содержащий окно предварительного просмотра печати, которое должно отображаться в главном окне моего приложения при его отключении. Когда пользователь закрывает окно предварительного просмотра, он должен включить главное окно и уничтожить объект PPREVIEW. Я хотел бы использовать его следующим образом:

PPREVIEW *p=new PPREVIEW;
//next, preview window is created, user interaction begins
p->ShowPreview(<parameters>); //but this function returns
delete p;

Так как ShowPreview действительно возвращает, строка выше уничтожит объект, пока окно все еще видимо. Если бы это было модальное диалоговое окно, это было бы возможно, так как функция DialogBox не возвращается в этот момент. Я думал, что мог бы положить «удалить это» где-нибудь после уничтожения окна предварительного просмотра печати. Естественно WM_DESTROY приходит на ум. Но MSDN заявляет в http://msdn.microsoft.com/en-us/library/windows/desktop/ms632620%28v=vs.85%29.aspx следующее: «можно предположить, что во время обработки WM_DESTROY дочерние окна все еще существуют», поэтому все еще существует вероятность того, что некоторые из них будут ссылаться на переменные экземпляра (и они делают, я получаю случайным образом ошибки доступа, когда я пытался это сделать, поэтому я отступил).

В настоящее время я выбрал:
- создать некоторую глобальную переменную,
- в WM_DESTROY окна предварительного просмотра печати я включил EnableWindow (MainWindow, TRUE) и установил для этой глобальной переменной значение FALSE.
- Затем, после события WM_ENABLE в главном окне, я проверяю глобальную переменную на FALSE и удаляю объект.

Но это довольно нелегко и требует, чтобы я программировал это поведение для каждого окна, в котором используется предварительный просмотр печати, поэтому я решил использовать предыдущий подход, а именно: создавать, использовать, возможно, самостоятельно удалять. Мне нужно либо:
- информацию, когда именно я могу использовать «удалить это» в процедуре окна PPREVIEW, если этот подход не является неразумным по какой-то причине, я не знаю о
- идея, как заставить метод ShowPreview не возвращаться, имитируя поведение DialogBox.
- другие предложения, которые достигают моей цели

Пожалуйста, помогите.

Ответы [ 2 ]

2 голосов
/ 02 октября 2011
  1. Ваша функция ShowPreview должна вызвать ShowWindow(), чтобы отобразить окно предварительного просмотра.Он также должен делать с основной формой все, что нужно, например, отключать ее.
  2. Когда ваше окно предварительного просмотра получает WM_CLOSE, оно должно удалить объект C ++, который обертывает его.Некоторая часть этого процесса также должна вызвать DestroyWindow() для основного дескриптора окна.Обработка по умолчанию WM_CLOSE сделает это, но, возможно, вы захотите сделать это в деструкторе объекта C ++.
0 голосов
/ 02 октября 2011

Если вы хотите, чтобы ShowPreview был модальным, вам нужно запустить цикл подчиненных сообщений. Вы можете найти некоторые примеры здесь , включая версию с обратным проектированием того, что DialogBox использует внутри.

В качестве альтернативы, вы можете просто WM_DESTROY окна предварительного просмотра как повторно включить главное окно, так и удалить PPREVIEW * (в этом случае ShowPreview не будет модальным, но будет автономным). ). Здесь вы должны быть осторожны, чтобы не трогать PPREVIEW * (или изнутри PPREVIEW функций-членов, не вызывать какие-либо другие члены или обращаться к переменным-членам) после вызова DestroyWindow() - это, в частности, означает вы не можете получить доступ к переменным члена в вашем обработчике сообщений после DefWindowProc() вызова

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...