Программирование на Visual C++. Архив рассылки | страница 34
Через некоторое время мне это надоело, и я решил, что раз уж не оказалось пророков среди читателей, пророком придется стать самому (это метафора;)
Самое обидное то, что ответ даже не пришлось искать ! Он лежал на самом видном месте в 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.