Программирование на Visual C++. Архив рассылки | страница 33



>for (POSITION pos= pTempl->GetFirstDocPosition(); pos != NULL; ) {

> CDocument * pDoc= pTempl->GetNextDoc(pos);

> if (msg == NULL) pDoc->UpdateAllViews(NULL);

> else

>  for (POSITION p1= pDoc->GetFirstViewPosition(); p1 != NULL; ) {

>   CView * pView= pDoc->GetNextView (p1);

>   pView->PostMessage (msg, w, l);

>  }

>}

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

>for (POSITION pos = pTempl->GetFirstDocPosition(); pos != NULL; ) {

> CDocument * pDoc= pTempl->GetNextDoc(pos);

> for (POSITION p1 = pDoc->GetFirstViewPosition(); p1 != NULL; ) {

>  CView * pView = pDoc->GetNextView(p1);

>  if (pView != NULL) return TRUE;

> }

>}

>return FALSE;

и т.д.

Активизация (всплывание наверх) MDI-окна в программе проще всего реализуется добавлением примерно такого метода класса CView:

>void CMyView::DoActivate() {

> CMDIChildWnd * pFrm = (CMDIChildWnd *)(GetParent());

> if (pFrm != NULL && IsWindow(pFrm->m_hWnd)) pFrm->MDIActivate();

>}

Victor Yakovlev

Да, это может быть полезно, особенно для тех, кто сталкивался (или кому еще только предстоит столкнуться) с разработкой сложных MDI-приложений – они знают, как трудно добиться правильной совместной работы всех дочерних окон. 

ВОПРОС-ОТВЕТ

Q. Нужно изменить шрифт у одного элемента типа CStatic. Делаю это функцией SetFont(CFont font). Фонт меняется у элемента … и у всего окна :(. Включая кнопки и другие элементы типа static. Мне его надо было толстым сделать, так у меня такие кнопки стали — загляденье:)) Кто-нибудь знает в чем дело и как решить ?

LiMar

A. Присланные ответы на этот вопрос сводились к двум следующим: 

1) сделать класс-наследник от CStatic и перекрыть функцию прорисовки – OnPaint();

2) вызывать метод SetFont() именно объекта CStatic (или указателя на этот контрол), а не всего диалога.

Порекомендовавшие первый способ явно забыли правило "бритвы" Оккама: не множить сущностей без нужды. (Кстати, нам, программистам, это правило особенно полезно.) Если для того, чтобы поменять шрифт, нужно создавать новый класс, ну уж извините… Этим способом, конечно, можно пользоваться, но я думаю, только в тех случаях, когда без этого не обойтись.

Итак, второй ответ был больше всего похож на искомую истину. Но "похож" – это еще не значит "есть", так что я решил проверить. Сделал простое SDI-приложение, и попробовал в окне About у одной из надписей поменять шрифт. 

Как же я был рад, когда он в самом деле изменился!!!

…Правда, на совершенно не тот, который я хотел. Да и размерчик прежний остался… Это было весело – в любом случае он ставил шрифт System, хотя (у меня много шрифтов!) я прописывал разные. Никакого результата. Способ No.2 у меня не работал. Либо он был неправильный, либо, как впоследствии оказалось, правильный не до конца.