Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том2)" -> 39

Visual С++ 6. Полное руководство: В 2 т.(том2) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том2) — Бином, 2006. — 530 c.
Скачать (прямая ссылка): vicualcc2006t2.djvu
Предыдущая << 1 .. 33 34 35 36 37 38 < 39 > 40 41 42 43 44 45 .. 173 >> Следующая

This is the OEM_PIXED_FONT stock font.
Рис. 18.6. Стандартные шрифты
Поддержка средств прокрутки
При генерации программы TextDemo с помощью мастера AppWizard необходимо указать, что класс представления порождается от класса CScrollView, чтобы окно представления поддерживало средства прокрутки. Прокрутка нужна, если строки текста не могут полностью поместиться внутри окна представления. Особенно часто это случается при выборе крупного шрифта. В этом параграфе добавлен фрагмент программы, сообщающий MFC текущий размер документа.
(Общее описание методов, применяемых для обеспечения средств прокрутки, приведено в гл. 13.)
Вначале удалим виртуальную функцию OnlnitialUpdate класса представления. Она сгенерирована мастером AppWizard и содержит стандартный код, передающий размер документа. Однако в программе TextDemo каждый раз при отображении диалогового окна Font и вызове функции UpdateAllViews происходит изменение размера документа. Следовательно, его необходимо передавать виртуальной функции OnUpdate (получающей управление при каждом вызове функции UpdateAllViews) вместо функции OnlnitialUpdate (вызываемой только один раз при запуске программы). Чтобы удалить объявление функции OnlnitialUpdate из класса представления, запустите мастер ClassWizard, откройте вкладку Maps Message, в списке Class name выберите имя класса CTextDemoView, в списке Member function — функцию OnlnitialUpdate и щелкните на кнопке Delete Function. Когда Developer Studio сгенерирует запрос о продолжении выполнения операции, щелкните на кнопке Yes. Затем откройте файл TextDemoView.cpp и вручную удалите определение функции OnlnitialUpdate.
Чтобы сгенерировать функцию OnUpdate, снова запустите мастер ClassWizard, откройте вкладку Message Maps, в списках Class name и Object IDs выберите CTextDemoView, в списке Message — OnUpdate и щелкните на кнопке Add Function. Затем щелкните на кнопке Edit Code и добавьте в функцию следующие строки.
void CTextDemoView::OnUpdate (
CView* pSender, LPARAM lHint, CObject* pHint)
;
// TODO: Здесь добавьте собственный код обработчика // и/или вызов базового класса
CTextDemoDoc* PDoc = GetDocument();
If (PDoc->m_Font.m_hObject == NULL) // шрифт еще не создан
SetScrollSizas (ММ_ТЕХТ, CSize (0,0)); else // шрифт создан
{
CClientDC ClientDC (this) ; int. LineWidth = 0; SIZE Size; TEXTMETRIC TM;
ClientDC.SelectObject (&PDoc->m_Font); ClientDC.GetTextMetrics (STM);
for (int Line = 0; Line < NUMLINES; ++Line)
{
Size = ClientDC.GetTextExtent (PDoc->m__LineTable [Line], PDoc->m_LineTable [Line].GetLength ()); if (Size.cx > LineWidth) LineWidth = Size.cx;
}
Size.cx = LineWidth + MARGIN;
Size.су = (TM-tmHeight + TM. tmExternalLeading) * (NUMLINES + 1) + MARGIN;
SetScrollSizes (MM_TEXT, Size); ScrollToPosition (CPolnt (0, 0)); }
CScrollView::OnUpdate (pSender, lHint, pHint);
}
Виртуальная функция OnUpdate вызывается при первоначальном создании окна представления, а также всякий раз, когда функция CTextDemoDoc: :OnOptionsFont обращается к CDocument: : UpdateAllViews после выбора нового шрифта (о функции OnUpdate рассказывалось в гл. 13). Функция OnUpdate устанавливает размер прокручиваемого документа (т.е. полный размер основной части текста), полученный исходя из размеров нового шрифта.
Для установки нового размера документа функция OnUpdate вызывает функцию CScrollView: : SetScrollSizes. Если шрифт не выбран, то задается нулевой размер документа, а полоса прокрутки скрывается, так как отображаемый текст отсутствует. Если шрифт уже выбран, то функция OnUpdate устанавливает общую высоту и ширину текста.
При вычислении высоты текста создается объект контекста устройства окна представления, затем выбирается объект шрифта в объекте контекста устройства и вызывается функция GetTextMetrics для получения размеров символов. Высота текста равна сумме высоты одиночной строки, умноженной на количество строк, и высоты верхнего поля.
Size.су = (TM.tmHeight + TM.tmExternalLeading) * (NUMLINES +1) + MARGIN;
При вычислении ширины текста вызывается функция CDC: : GetLength для получения длины каждой строки. Ширина текста, равная максимальной длине строки, хранится в LineWidth.
Size.cx = LineWidth + MARGIN;
Заметим: функция GetTextMetrics возвращает среднюю ширину символа в поле tmAveCharWidth структуры TEXTMETRIC. В шрифте с переменным питчем для получения ширины символа или длины строки эту информацию использовать нельзя, так как ширина символов непостоянна. Тем не менее, функция GetLength возвращает действительную длину конкретной строки символов.
После установки размера документа функция OnUpdate вызывает функцию CScrollView: : ScrollToPosition, чтобы прокрутить окно представления к началу текста.
SetScrollSizes (ММ_ТЕХТ, Size); ScrollToPosition (CPoint (0, 0));
Наконец, функция OnUpdate вызывает версию функции OnUpdate из класса CScrollView, чтобы она выполнила свою стандартную операцию (сделала недействительным все окно, что приводит к его перерисовке).
CScrollView::OnUpdate (pSender, lHint, pHint);
Предыдущая << 1 .. 33 34 35 36 37 38 < 39 > 40 41 42 43 44 45 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100