
- •2. Призначення mfc. Ієрархія класів mfc (картинка иерархии http://realcoding.Net//images/mfc/gl1-5.Jpg). Спеціальні типи даних.
- •3. Організація простої mfc-програми (класи, функції). Послідовність роботи програми.
- •4. Організація обробки повідомлень. Приклади обробки повідомлень.
- •7. Створення головного меню програми (робота у редакторі ресурсів, варіанти підключення).
- •8. Поняття контексту пристрою. Застосування контекстів пристрою. Обробка повідомлення wm_paint.
- •11. Використання меню та акселераторів. Обробка пунктів меню.
- •12. Діалогові вікна модального та немодального типів. Реалізація класів. Особливості конструкторів. Приклади .
- •16. Смуги прокручування та обробка їх повідомлень. Полосы прокрутки
- •19. Встановлення та отримання характеристик тексту. Системні та логічні шрифти.
- •20. Особливості використання системних шрифтів.
- •21. Особливості використання логічних шрифтів.
- •30. Відображення рухомих об’єктів у mfc-програмах.
19. Встановлення та отримання характеристик тексту. Системні та логічні шрифти.
Из книги: Встановлення та отримання характеристик тексту
Функція TextOut() надає можливість вивести текстовий рядок, почина-ючи з вказаної позиції, але не дозволяє задавати формат виведення й не виконує переведення тексту на новий рядок.
Windows використовує різні шрифти і мають існувати способи їх зміни.
За допомогою функції GetTextMetrics() можна отримати інформацію про поточний шрифт. Ця функція має такий прототип:
BOOL CDC::GetTextMetrics( LPTEXTMETRIC lpMetrics ) ;
Функція записує поточні установки системного шрифту у покажчик lpMetrics. Цей покажчик вказує на тип TEXTMETRIC, який містить поточні установки текстового шрифту, пов’язаного із даним контекстом пристрою.
typedef struct tagTEXTMETRIC { /* tm */
int tmHeight; // повна висота шрифту
int tmAscent; // висота над базовою лінією
int tmDescent; // висота підрядкових елементів
int tmInternalLeading; // пустий простір над символами
int tmExternalLeading; // інтервал між рядками
int tmAveCharWidth; // середня ширина символів
int tmMaxCharWidth; // максимальна ширина символів
int tmWeight; // насиченість (жирність) символів
int tmOverhang; // додаткова насиченість для спеціальних шрифтів
int tmDigitizedAspectX; // горизонтальний коефіцієнт стискання
int tmDigitizedAspectY; // вертикальний коефіцієнт стискання
BYTE tmItalic; // не 0, якщо шрифт – курсив
BYTE tmUnderlined; // не 0, якщо шрифт – із підкресленням
BYTE tmStruckOut; // не 0, якщо шрифт – перекреслений
BYTE tmFirstChar; // перший символ шрифту
BYTE tmLastChar; // останній символ шрифту
BYTE tmDefaultChar; // символ шрифту за замовчуванням
BYTE tmBreakChar; // символ – роздільник слів
BYTE tmPitchAndFamily; // тип та сімейство шрифту
BYTE tmCharSet; // ідентифікатор базового набору символів
} TEXTMETRIC;
Такі основні характеристики має шрифт тексту, що правда, практично, ми не бачимо належності цього шрифту до будь-якого звичайного читачеві шрифту, наприклад “Times New Roman”. Про це – дещо пізніше.
З тієї причини, що символи шрифту можуть мати різну ширину, обчис-лення довжини рядка на основі кількості символів у рядку втрачає сенс. Тому потрібно використовувати функцію GetTextExtent():
СSize СDC::GetTextExtent(LPCSTR lpszString, int Len);
де lpszString – покажчик на рядок, довжину якого необхідно обчислити; Len – кількість символів у рядку; CSize – окремий тип, відповідний структурі SIZE:
typedef struct tagSize
{LONG cx; // ширина
LONG cy; // висота
}SIZE;
Лаба4:
void CMainWin::OnText()
{char t[255];
CClientDC DC(this);
TEXTMETRIC tm;
CSize size;
DC.SetTextColor(RGB(125,125,0));
DC.SetBkColor(RGB(255,125,0));
DC.GetTextMetrics(&tm);
wsprintf(t,"Шрифт має висоту %ld логічних одиниць",tm.tmHeight);
DC.TextOut(m_X,m_Y,t,strlen(t));
m_Y=m_Y+tm.tmHeight+tm.tmExternalLeading;
strcpy(t,"Рядок перейшов на наступну позицію");
DC.TextOut(m_X,m_Y,t,strlen(t));
m_Y=m_Y+tm.tmHeight+tm.tmExternalLeading;
wsprintf(t,"Шрифт має насиченість %ld одиниць",tm.tmWeight);
DC.TextOut(m_X,m_Y,t,strlen(t));
size=DC.GetTextExtent(t,strlen(t));
wsprintf(t,"Попередній рядок має довжину %ld логічних одиниць",size.cx);
m_Y=m_Y+tm.tmHeight+tm.tmExternalLeading;
DC.TextOut(m_X,m_Y,t,strlen(t));
m_Y=m_Y+tm.tmHeight+tm.tmExternalLeading;
wsprintf(t,"Розміри екрану: %d %d",maxX,maxY);
DC.TextOut(m_X,m_Y,t,strlen(t));
}