Алекс Jenter - Программирование на Visual C++. Архив рассылки
- Название:Программирование на Visual C++. Архив рассылки
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алекс Jenter - Программирование на Visual C++. Архив рассылки краткое содержание
РАССЫЛКА ЯВЛЯЕТСЯ ЧАСТЬЮ ПРОЕКТА RSDN, НА САЙТЕ КОТОРОГО ВСЕГДА МОЖНО НАЙТИ ВСЮ НЕОБХОДИМУЮ РАЗРАБОТЧИКУ ИНФОРМАЦИЮ, СТАТЬИ, ФОРУМЫ, РЕСУРСЫ, ПОЛНЫЙ АРХИВ ПРЕДЫДУЩИХ ВЫПУСКОВ РАССЫЛКИ И МНОГОЕ ДРУГОЕ.
Программирование на Visual C++. Архив рассылки - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
}
}
return FALSE;
и т.д.
Активизация (всплывание наверх) MDI-окна в программе проще всего реализуется добавлением примерно такого метода класса CView:
void CMyView::DoActivate() {
CMDIChildWnd * pFrm = (CMDIChildWnd *)(GetParent());
if (pFrm != NULL && IsWindow(pFrm->m_hWnd)) pFrm->MDIActivate();
}
Да, это может быть полезно, особенно для тех, кто сталкивался (или кому еще только предстоит столкнуться) с разработкой сложных MDI-приложений – они знают, как трудно добиться правильной совместной работы всех дочерних окон.
Q.Нужно изменить шрифт у одного элемента типа CStatic. Делаю это функцией SetFont(CFont font). Фонт меняется у элемента … и у всего окна :(. Включая кнопки и другие элементы типа static. Мне его надо было толстым сделать, так у меня такие кнопки стали — загляденье:)) Кто-нибудь знает в чем дело и как решить ?
LiMarA.Присланные ответы на этот вопрос сводились к двум следующим:
1) сделать класс-наследник от CStatic и перекрыть функцию прорисовки – OnPaint();
2) вызывать метод SetFont() именно объекта CStatic (или указателя на этот контрол), а не всего диалога.
Порекомендовавшие первый способ явно забыли правило "бритвы" Оккама: не множить сущностей без нужды. (Кстати, нам, программистам, это правило особенно полезно.) Если для того, чтобы поменять шрифт, нужно создавать новый класс, ну уж извините… Этим способом, конечно, можно пользоваться, но я думаю, только в тех случаях, когда без этого не обойтись.
Итак, второй ответ был больше всего похож на искомую истину. Но "похож" – это еще не значит "есть", так что я решил проверить. Сделал простое SDI-приложение, и попробовал в окне About у одной из надписей поменять шрифт.
Как же я был рад, когда он в самом деле изменился!!!
…Правда, на совершенно не тот, который я хотел. Да и размерчик прежний остался… Это было весело – в любом случае он ставил шрифт System, хотя (у меня много шрифтов!) я прописывал разные. Никакого результата. Способ No.2 у меня не работал. Либо он был неправильный, либо, как впоследствии оказалось, правильный не до конца.
Через некоторое время мне это надоело, и я решил, что раз уж не оказалось пророков среди читателей, пророком придется стать самому (это метафора;)
Самое обидное то, что ответ даже не пришлось искать ! Он лежал на самом видном месте в MSDN. Я ввел "SetFont" в строке поиска и мгновенно обнаружил интереснейшую статью с говорящим само за себя названием – "Correct Use of the SetFont() Function in MFC".
Суть статьи сводилась к следующему:
Обычно в SetFont передают указатель на шрифт – объект CFont. Так вот, обязательно нужно проследить , чтобы этот объект не уничтожился раньше, чем тот контрол, для которого он создается!
Итак, как было у меня раньше (или "способ №2"):
BOOL CAboutDlg::OnInitDialog() {
CDialog::OnInitDialog();
CFont times;
times.CreatePointFont(100, " Times New Roman");
m_Static.SetFont(×);
times.DeleteObject();
return TRUE;
}
m_Static — переменная, представляющая соответствующий Static-контрол. Вместо нее можно воспользоваться указателем, возвращаемым ф-цией GetDlgItem(). Как вы видите, объект CFont уничтожается сразу же после вызова SetFont().
А вот как надо было сделать:
class CAboutDlg : public CDialog {
…
private:
CStatic m_Static;
CFont m_fntTahoma; // добавляем шрифт в диалог
}
BOOL CAboutDlg::OnInitDialog() {
CDialog::OnInitDialog();
m_fntTahoma.CreatePointFont(100, " Tahoma");
m_Static.SetFont(&m_fntTahoma);
return TRUE;
}
BOOL CAboutDlg::DestroyWindow() {
m_fntTahoma.DeleteObject();
return CDialog::DestroyWindow();
}
Здесь все работает как надо. Вскоре, когда надоела Tahoma, я уже наслаждался отлично выглядевшей готической надписью. (Кстати, тут возникает еще вопрос – получается, чтобы нужный шрифт был всегда доступен, нужно распространять его вместе с приложением? Конечно, это не относится к стандартным Windows-шрифтам, типа Arial, Times, Tahoma или Courier. Лучше все-таки обходиться ими, когда возможно).
Тех, кто хочет получить больший контроль над шрифтом – сделать его жирным, курсивом и т.д., отправляю прямиком к той же статье, да еще к функции CFont::CreateFontIndirect().
Я прошу прощения, что, возможно, слишком подробно расписал ответ на этот вопрос (хотя не исключаю, что кому-то это было интересно прочитать). Я преследовал еще одну цель – сказать всем: "Люди, учитесь пользоваться MSDN! На многие ваши вопросы там уже отвечено!"
Ответ на этот вопрос прислали: Николай Чепкий , Igor Sorokin, Alexander Dymerets, Pavel Vasev.
Q.Как получить доступ к ресурсам DLL в самой DLL? Задача сводилась к следующему – нужно было сделать диалоговое окно в функции, которая находилась в DLL.
declspec(dllexport)
int MyDllFunction() {
CDialog dlg ;
int ret = dlg.DoModal();
return ret ;
}
DLL имела ресурс Dialog для этого диалогового окна, но работать напрочь отказывалась – этот ресурс не обнаруживался и окно не создавалось. DLL собиралась как со статически линкуемой библиотекой MFC, так и с динамически линкуемой библиотекой MFC.
Igor SorokinЗа сим откланиваюсь.
Будьте здоровы!
©Алекс Jenter mailto:jenter@mail.ru Красноярск, 2000.Программирование на Visual C++
Выпуск №10 от 18/07/2000
Здравствуйте!
Прошу прощения за небольшую задержку этого выпуска.
Между прочим, со дня создания рассылки уже прошел целый месяц. За это время на нее подписалось более 5000 человек, причем чуть меньше 4000 из них – на HTML версию.
Недавно мне пришло письмо от одного человека с предложением рассказать в рассылке об их сайте, часть которого посвящена как раз программированию на Visual C++. Тогда у меня появилась идея сделать эту рубрику, где я мог бы рассказывать об интересных ресурсах по теме рассылки, которые можно обнаружить на просторах интернета. Я уже, правда, рассказывал про CodeGuru – но это не было вынесено в отдельную рубрику… да и те, кто не очень дружит с английским, могли задаться вопросом, а нет ли в Сети чего-нибудь интересного по VC на русском языке?
Итак, сегодня, по специальному предложению одного из авторов, мы с вами рассмотрим сайт " ПЕРВЫЕ ШАГИ " ( http://www.mjk.msk.ru/~dron/)
Прежде всего, стоит отметить широкий диапазон тем, охватываемых этим сайтом – это MFC, WinAPI, OpenGL, ActiveX, а также VBA, SQL, HTML, CGI, Perl, форматы файлов, алгоритмы и многое другое.
Содержание оформлено в виде "шагов" – отсюда, в частности, и название – маленьких порций информации, которые легко читать и усваивать. Обычно каждый шаг ставит и выполняет определенную задачу, так что легко можно найти решение какой-то конкретной проблемы.
Все описанное мной далее относится к разделу "Visual C++".
Есть материал как для начинающих, так и для более продвинутых программистов. Раздел, посвященный MFC, содержит более 200 "шагов". Темы шагов в большинстве своем подобраны интересные и нужные, а для новичков, не имеющих возможности свободно читать MSDN, вообще незаменимые.
Читать дальшеИнтервал:
Закладка: