Программирование на Visual C++. Архив рассылки | страница 32
[…]
Спасибо, что дочитали даже до этого места, надеюсь, содержанием не разочаровал. Ваша рассылка уже rules, а она (я надеюсь) только начинает раскачиваться.
Спасибо за вашу работу и за ее результат.
--
Пишите письма…
(адрес может быть опубликован, но не продан спаммерам :)
Чепкий Николай (mailto:alterego@a-teleport.com)
Адрес я опубликовал, но спаммерам не продавал – так что моя совесть на этот счет чиста. ;) Если это сделает кто-нибудь из читателей – это будет на его, а не моей, совести.
Вопрос этот обсуждался в прошлом выпуске. Преимущество способа, предложенного Николаем, заключается в автоматизации обработки нажатий клавиш. Так что вместо неуклюжего switch'a в случае большого количества клавиш мы получаем удобный списочек – и минимум кода.
Один из читателей прислал интересный совет, предлагаю его вашему вниманию:
Привет!
Хочу обратить внимание на то, что изменение формы окон при помощи SetWindowRgn() не всегда правильно работает в старых версиях Windows – в частности, такая ситуация наблюдалась под Windows 95 (PLUS) не OSR 2.
Зато совершенно точно это работает под '98, NT, 2000.
-------
Хочу предложить полезную уловку, позволяющую при использовании MFC-шаблонов документов управлять MDI-окнами из приложения. Этот трюк можно использовать при отображении разных категорий данных в различных окнах. При этом можно, в частности, автоматически переключать активные MDI-окна при обновлении данных в них.
Представьте библиотеку (класс), следующего вида:
>class TReg {
>public:
> static CMapStringToPtr map;
> static BOOL RegisterTemplate(CString strName, CDocTemplate * ptr);
> static BOOL HasOpenViews(CString strName);
> static BOOL PostForAllViews(CString strName, UINT msg, WPARAM w, LPARAM p);
> static BOOL SendForAllViews(CString strName, UINT msg, WPARAM w, LPARAM p);
> static CDocTemplate * GetTemplate(CString strName);
> ...
>};
Зачем все элементы статические – легко понять, ведь у нас только один MDI-фрейм.
Далее, в методе WinApp::InitInstance() при порождении шаблонов документов вместо (или вместе с) AddDocTemplate( CDocTemplate * ) записываем TReg::RegisterTemplate( "MyName", CDocTemplate * );
Здесь мы просто добавляем указатели шаблонов в словарь map.
С помощью метода GetTemplate() мы можем извлечь указатель на шаблон из словаря по имени. Используя этот указатель, мы можем:
– открыть новое окно при помощи DocTemplate::OpenDocumentFile();
– закрыть все окна, относящиеся к данному шаблону;
– отправить сообщение всем окнам данного шаблона: