Программирование на 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();

– закрыть все окна, относящиеся к данному шаблону;

– отправить сообщение всем окнам данного шаблона: