Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Ed->SetWindowText(програмування); //Встановлення тексту у полі редагування 2 страница
Наведемо приклад програми із визначенням піктограм, курсорів, пензля.
Приклад 4.1 – Проста програма із визначенням піктограми, курсору та пензля
// App.h: interface for the CApp class class CApp: public CWinApp {public: BOOL InitInstance(); };
class CMainWin: public CFrameWnd {public: CMainWin(LPCSTR); };
// App.cpp: implementation of the CApp class.
#include < afxwin.h> #include " App.h" #include " resource.h"
CMainWin:: CMainWin(LPCSTR winStyle) {Create(winStyle, " Приклад із визначенням стилю оформлення"); }
BOOL CApp:: InitInstance() {CBrush MyBrush; MyBrush.CreateStockObject(LTGRAY_BRUSH); LPCSTR winStyle = AfxRegisterWndClass(0, LoadCursor(IDC_CURSOR1), MyBrush, LoadIcon(IDI_ICON1)); m_pMainWnd = new CMainWin(winStyle); m_pMainWnd-> ShowWindow(m_nCmdShow); m_pMainWnd-> UpdateWindow(); return TRUE; }
CApp App; Побудова програми є дуже простою. У функції InitInstance() формується стиль пензля, з ресурсів завантажуються визначені користувачем курсор IDC_CURSOR1 та піктограма IDI_ICON1. Усі вони разом за допомогою функції AfxRegisterWndClass() формують стиль оформлення програми, що записується у змінну winStyle. Цей стиль далі передається у конструктор головного вікна програми – CMainWin(LPCSTR). У свою чергу стиль передається функції Create() першим параметром і впливає на відображення головного вікна програми.
4.2 Основи роботи із растровими зображеннями
Microsoft Windows є графічною операційною системою і використання зображень не є чимось особливим та незвичайним. Растрове зображення є автономним графічним ресурсом, що використовується як єдине ціле і містить порозрядний опис зображення, яке виводиться на екран без змін. Растрові зображення описуються класом CBitmap. Растрове зображення можна створити у редакторі ресурсів Visual C++ або скопіювати через буфер пам’яті з будь-якого графічного редактора у редактор ресурсів. Тут слід зазначити, що бітове зображення, створене у подібний спосіб називатиметься апаратно залежним – або DDB-зображенням (Device Dependent Bitmap), на відміну від апаратно незалежних зображень, які мають назву DIB-зображень (Device Independent Bitmap) і можуть подаватися у вигляді дискових файлів із розширенням *.bmp. Відображення растрових зображень типу DIB є окремою проблемою і у простий спосіб не вирішується. Зокрема в усіх прикладах відкриття DIB-файлів зазвичай створюється самостійний клас CDib із багатьма функціями. Так що робота із DIB-файлами є окремим питанням. Апаратно-залежне растрове зображення, створене за допомогою редактора ресурсів Visual C++ або скопійоване до нього, отримує свій власний ідентифікатор. Наприклад IDB_BITMAP1. Це зображення, однак, має бути пов’язано із об’єктом класу CBitmap і завантажено у нього. Для цього можна використати функцію LoadBitmap():
BOOL CBitmap:: LoadBitmap(LPCSTR lpszBitmapName); BOOL CBitmap:: LoadBitmap(UINT idBitmap);
де lpszBitmapName – ім’я растрового зображення, а idBitmap – ідентифікатор ресурсу растрового зображення. Ця операція описується у такий спосіб:
CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1);
Взагалі, для того, щоб вивести растрове зображення на екран необхідно: 1) отримати контекст пристрою, для того, щоб програма мала можливість виводити інформацію у робочу область вікна; 2) отримати сумісний з ним контекст пристрою для області пам’яті (memory device context), у якому растрове зображення буде зберігатиметься до моменту виводу на екран; 3) вибрати необхідне зображення з файла ресурсів у контекст області пам’яті; 4) скопіювати зображення з контексту області пам’яті у контекст вікна. В результаті зображення буде виведено на екран. Нехай зображення виводиться у головне вікно програми натисканням лівої клавіші миші. Тоді, текст обробника можна описати у такий спосіб, описаний у прикладі 4.2. Приклад 4.2 – Приклад обробника лівої клавіші миші із виведенням растрового зображення у головне вікно програми
void CMain:: OnLButtonDown(UINT flags, CPoint Loc) {CClientDC dc(this); CDC memDC; memDC.CreateCompatibleDC(& dc); memDC.SelectObject(& bmp1); dc.BitBlt(Loc.x, Loc.y, 48, 48, & memDC, 0, 0, SRCCOPY); }
Можна побачити, що у наведеному обробнику спочатку отримується контекст dc пристрою вікна. Далі оголошується проміжний контекст області пам’яті memDC, що за допомогою функції CreateCompatibleDC() встановлюється сумісним з контекстом головного вікна. Наступним рядком зображення bmp1 обирається функцією SelectObject() у контекст області пам’яті. Насамкінець, вміст контексту області пам’яті копіюється у функції BitBlt () до контексту головного вікна програми відносно позиції, заданої координатами миші. Нові функції, введені у обробнику прикладу 4.2, мають такі прототипи:
virtual BOOL CDC:: CreateCompatibleDC(CDC* pDC);
Функція CreateCompatibleDC() створює контекст області пам’яті, сумісний з pDC, де pDC – покажчик на контекст пристрою.
CPen* CDC:: SelectObject(CPen* pPen); CBrush* CDC:: SelectObject(CBrush* pBrush); virtual CFont* CDC:: SelectObject(CFont* pFont); CBitmap* CDC:: SelectObject(CBitmap* pBitmap);
Функція SelectObject() обирає об’єкт у контекст пристрою. Об’єктом може бути перо типу CPen, пензель типу CBrush, шрифт типу CFont, растрове зображення типу CBitmap.
BOOL CDC:: BitBlt(int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop);
Функція копіює растрове зображення з контексту - джерела у цільовий контекст. Серед параметрів x, y – координати верхнього лівого кута прямокутника у цільовому контексті пристрою; nWidth, nHeight – ширина та висота зображення; pSrcDC – покажчик на контекст – джерело зображення; xSrc, ySrc – зміщення координат лівого верхнього кута растрового зображення відносно верхнього лівого кута прямокутника у цільовому контексті пристрою, dwRop – режим побітової передачі зображення з пам’яті не екран. Режими передавання зображення наведено у таблиці 4.1. Растрове зображення звичайно вилучається одночасно з об’єктом типу СBitmap. Зображення також можна вилучити програмно – за допомогою функції CGDIObject:: DeleteObject().
Таблиця 4.1 – Режими копіювання зображень функції BitBlt() [2]
Необхідно пояснити ще одну особливість виведення зображень. Об’єкт CBitmap не містить в собі інформації про розміри зображення, необхідні під час виведення. Можна використати особливість, подібної до CBitmap структури BITMAP – використати таку програмну послідовність:
BITMAP bm; // оголошення об’єкта структури BITMAP bmp1.GetBitmap(& bm); // передача параметрів з bmp1 у bm
Надалі при виведенні зображення на екран можна використати ширину та висоту, отримані зі структури BITMAP:
dc.BitBlt(Loc.x, Loc.y, bm.bmWidth, bm.bmHeight, & mdc, 0, 0, SRCCOPY);
Приклад 4.2 демонструє приклад програми із виведенням зображень. Спо-чатку у конструкторі вікна програми завантажуються ресурси двох растрових зображень. Потім ці зображення виводяться натисканням лівої та правої клавіш миші. Вікно із результатом роботи програми зображено на рисунку 4.1.
Приклад 4.2 – Текст програми із виведенням растрових зображень
// App.h: interface for the CApp class. class CApp: public CWinApp {public: BOOL InitInstance(); };
class CMain: public CFrameWnd {public: void OnRButtonDown(UINT, CPoint); void OnLButtonDown(UINT, CPoint); CMain(LPCSTR); DECLARE_MESSAGE_MAP() private: CBitmap bmp1, bmp2; };
// App.cpp: implementation of the CApp class. #include < afxwin.h> #include " App.h" #include " resource.h"
CMain:: CMain(LPCSTR winStyle) {Create(winStyle, " Програма виводу растрового зображення", WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_MENU1)); bmp1.LoadBitmap(IDB_BITMAP1); bmp2.LoadBitmap(IDB_BITMAP2); }
BOOL CApp:: InitInstance() {CBrush brush(RGB(255, 255, 255)); LPCSTR winStyle = AfxRegisterWndClass(0, LoadStandardCursor(IDC_ARROW), brush, LoadStandardIcon(IDI_WINLOGO)); m_pMainWnd = new CMain(winStyle); m_pMainWnd-> ShowWindow(m_nCmdShow); m_pMainWnd-> UpdateWindow(); return TRUE; }
CApp App;
BEGIN_MESSAGE_MAP(CMain, CFrameWnd) ON_WM_LBUTTONDOWN() ON_WM_RBUTTONDOWN() END_MESSAGE_MAP()
void CMain:: OnLButtonDown(UINT Flag, CPoint Loc) {BITMAP bm; bmp1.GetBitmap(& bm); CClientDC dc(this); CDC mdc; mdc.CreateCompatibleDC(& dc); mdc.SelectObject(& bmp1); dc.BitBlt(Loc.x, Loc.y, bm.bmWidth, bm.bmHeight, & mdc, 0, 0, SRCCOPY); }
void CMain:: OnRButtonDown(UINT Flag, CPoint Loc) {BITMAP bm; bmp2.GetBitmap(& bm); CClientDC dc(this); CDC mdc; mdc.CreateCompatibleDC(& dc); mdc.SelectObject(& bmp2); dc.BitBlt(Loc.x, Loc.y, bm.bmWidth, bm.bmHeight, & mdc, 0, 0, SRCCOPY); }
На жаль така приємна на вигляд і проста з точку зору пояснення програма має суттєвий недолік: при переміщенні, зміненні розмірів, згортанні та розгортанні вікна зображення втрачаються. Вирішенням цієї проблеми ми і займемося у наступному розділі.
Рисунок 4.1 – Результати роботи програми виводу растрових зображень
4.3 Особливості виведення тексту у MFC-програмах
4.3.1 Визначення режимів виведення тексту В основному, виведення тексту у вікно програми MFC організує за допомогою функції TextOut(), що вже розглядалася раніше. Ця функція дозволяє вивести рядок в зазначену позицію. Координати вказуються відносно лівого верхнього кута клієнтської (внутрішньої) області вікна. Верхній лівий кут має координати (0, 0). Ці координати вказуються, до речі, у логічних одиницях, які в процесі роботи перетворюються у пікселі.
virtual BOOL CDC:: TextOut(int x, int y, LPCTSTR lpszString, int nCount); BOOL CDC:: TextOut(int x, int y, const CString& str);
де x – визначає логічну координату X початкової точки тексту у логічних одиницях; y – визначає координату Y початкової точки тексту у логічних одиницях; lpszString – покажчик на рядок символів; nCount – кількість байтів у рядку; str – об’єкт типу CString, що містить рядок символів. За замовчуванням, текст відображується чорним кольором на білому фоні. Але користувач може й змінити як колір так і фон.
virtual COLORREF CDC:: SetTextColor(COLORREF crColor); virtual COLORREF CDC:: SetBkColor(COLORREF crColor);
де crColor – колір тексту та фону, відповідно у функціях SetTextColor() та SetBkColor(). СOLORREF є 32-розрядним числом, що задає колір у форматі RGB (red, green, blue). Відносні інтенсивності трьох кольорів у сумі дають ре-альний колір. Значення кольорів задаються у діапазоні від 0 (нульова інтенсивність) до 255 (максимальна інтенсивність). Колір задається у такому вигляді:
COLORREF RGB(BYTE red, BYTE green, BYTE blue); Приклади завдання кольорів: білий – RGB(255, 255, 255); чорний – RGB(0, 0, 0); світло-блакитний – RGB(0, 100, 100). Додатково для встановлення параметрів виведення використовується функція SetBkMode(), яка визначає що відбуватиметься з поточним кольором фону під час відображення тексту:
int CDC:: SetBkMode(int Mode);
де Mode – режим фону, який може приймати значення OPAQUE (непрозорий), або TRANSPARENT (прозорий). Якщо встановлюється режим OPAQUE, щоразу під час виведення тексту, колір фону змінюється на прозорий. Якщо ж встановлюється режим TRANSPARENT, колір фону не змінюється.
4.3.2 Встановлення та отримання характеристик тексту Функція 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; За допомогою функції GetSystemMetric() можна обчислити деякі параметри системи, у тому числі розміри екрана: int GetSystemMetrics(int nIndex); де як nIndex можна задати параметр, що необхідно отримати: Таблиця 4.2 – Параметри функції GetSystemMetrics для отримання розмірів екрана
Розглянувши всі зазначені функції можна перейти до прикладу програми, що виводить текст із інформацією про наявні характеристики шрифту. Програма не визначає шрифт, а використовує системні настройки (системний шрифт). Знову таки, суттєвим недоліком програми є втрата виведеної інформації після операцій із вікном. Приклад 4.3 – Програма із виведенням параметрів тексту // file text.h class CMainWin: public CFrameWnd {public: void OnText(); void OnExit(); CMainWin(); DECLARE_MESSAGE_MAP() private: int m_X, m_Y; };
class CApp: public CWinApp {public: BOOL InitInstance(); };
// text.cpp: implementation of classes. #include < afxwin.h> #include " im1.h" #include " resource.h "
int maxX, maxY;
CMainWin:: CMainWin() {Create(NULL, " програма із виведенням тексту", WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_MENU1)); m_X=m_Y=0; maxX=GetSystemMetrics(SM_CXSCREEN); maxY=GetSystemMetrics(SM_CYSCREEN); }
BOOL CApp:: InitInstance() {m_pMainWnd = new CMainWin; m_pMainWnd -> ShowWindow(m_nCmdShow); m_pMainWnd -> UpdateWindow(); return TRUE; }
CApp App;
BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd) ON_COMMAND(ID_FIRST_EXIT, OnExit) ON_COMMAND(ID_EDIT_TEXT, OnText) END_MESSAGE_MAP()
void CMainWin:: OnExit() {SendMessage(WM_CLOSE); }
void CMainWin:: OnText() {char t[255]; CClientDC DC(this); TEXTMETRIC tm; CSize size; DC.SetTextColor(RGB(255, 0, 0)); DC.SetBkColor(RGB(0, 255, 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)); } Результати роботи програми наведені на рисунку 4.2.
Рисунок 4.2 – Приклад вікна програми із виведенням тексту системним шрифтом
4.3.3 Використання вбудованих шрифтів Вбудовані шрифти є готовими об’єктами. Їх використання забезпечується MFC-функцією CreateStockObject(int nIndex). Тут, nIndex є константою, що визначає тип готового об’єкта. Для шрифтів це має такі значення: ANSI_FIXED_FONT - фіксований ANSI системний шрифт. ANSI_VAR_FONT - змінний ANSI системний шрифт. DEVICE_DEFAULT_FONT - апаратно-залежний шрифт. OEM_FIXED_FONT - шрифт виробника апаратного забезпечення SYSTEM_FONT - системний шрифт за замовчуванням Windows використовує системний шрифт для відображення меню, елементів керування діалогового вікна, текстового виведення SYSTEM_FIXED_FONT - системний шрифт фіксованої ширини, використовуваний у Windows до версії 3.0 (доступний для сумісності).
Для роботи із вбудованими шрифтами необхідно: 1. Створити об’єкт типуCFont. 2. Завантажити об’єкт шрифту за допомогою функції CreateStockObject(). 3. Обрати завантажений шрифт функцією SelectObject(). Для завантаження системних шрифтів внесемо такі зміни у приклад 4.3. 1. Додамо об’єкти класу CFont у клас вікна:
сlass CMainWin: public CFrameWnd {public: CFont m_AnsiFixFont, m_AnsiVarFont; // об’єкти шрифту ........................ };
2. Додамо завантаження шрифтів у конструктор класу вікна
CMainWin:: CMainWin() {m_AnsiVarFont.CreateStockObject(ANSI_VAR_FONT); m_AnsiFixFont.CreateStockObject(ANSI_FIX_FONT); ..........................}
3. Перепишемо обробник OnText():
void CMainWin:: OnText() {char t[255]; CClientDC DC(this); TEXTMETRIC tm; CSize size; DC.SetTextColor(RGB(255, 0, 0)); DC.SetBkColor(RGB(0, 255, 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; DC.SelectObject(& m_AnsiVarFont); strcpy(t, " Рядок перейшов на наступну позицію шрифтом ANSI_VAR_FONT"); 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 шрифтом ANSI_FIX_FONT", maxX, maxY); DC.SelectObject(& m_AnsiFixFont); DC.TextOut(m_X, m_Y, t, strlen(t)); }
Результат роботи програми наведений на рисунку 4.3. Наочною є зміна шрифтів.
Рисунок 4.3 – Приклад програми із використанням системних шрифтів
4.3.4 Логічні шрифти та їх завантаження Читач може зауважити, чому це виведення тексту не враховувало звичні користувачу шрифти, а замість того пропонувався системний шрифт. Причина у тому, що усі звичні для користувача Windows шрифти не є системними, а логічними, тобто перед виведенням такого шрифту слід завантажити необхідні характеристики усіх можливих символів. Створення логічних шрифтів забезпечується структурою LOGFONT. Вона певною мірою схожа на структуру TEXTMETRIC, але має й ряд власних особливостей. typedef struct tagLOGFONT { LONG lfHeight; // висота шрифту у логічних одиницях LONG lfWidth; // ширина шрифту у логічних одиницях LONG lfEscapement; // кут нахилу рядка (у десятих долях градуса) відносно // нижнього краю сторінки LONG lfOrientation; // кут нахилу базової лінії кожного символу (у десятих // долях градуса) відносно нижнього краю сторінки LONG lfWeight; // насиченість шрифту у діапазоні від 0 до 1000 // (400 - нормальний шрифт, 700 – жирний) BYTE lfItalic; // TRUE, якщо шрифт – курсив BYTE lfUnderline; // TRUE, якщо шрифт – підкреслений BYTE lfStrikeOut; // TRUE, якщо шрифт – перекреслений BYTE lfCharSet; // базовий набір символів (ANSI_CHARSET, OEM_CHARSET, SYMBOL_CHARSET, UNICODE_CHARSET) BYTE lfOutPrecision; // точність виведення шрифту відносно стандартної BYTE lfClipPrecision; // точність перекриття заданого діапазону BYTE lfQuality; // вихідна якість шрифту (DEFAULT_QUALITY - якість за замовчуванням, DRAFT_QUALITY - чорнова якість, PROOF_QUALITY) - вища якість BYTE lfPitchAndFamily; // тип та сімейство шрифту(FF_DECORATIVE, FF_DONTCARE, FF_MODERN, FF_ROMAN, FF_SCRIPT, FF_SWISS) TCHAR lfFaceName[LF_FACESIZE]; // рядок із іменем шрифту } LOGFONT, *PLOGFONT;
Для використання логічного шрифту зробимо таку послідовність дій: 1. Оголосимо глобальні змінні типу LOGFONT та CFont:
LOGFONT lf; CFont font1;
2. Завантажити діалог вибору шрифтів та обрати необхідний шрифт:
CFontDialog a; a.DoModal(); a.GetCurrentFont(& lf); // вибір опису шрифта у структуру логічного шрифту
3. Безпосередньо перед виведенням тексту створити фізичний шрифт на основі логічного опису та завантажити його у контекст пристрою вікна:
CClientDC dc(this); font1.CreateFontIndirect(& lf); // створення фізичного шрифту на основі логічного опису dc.SelectObject(font1); // вібір фізичного шрифту dc.TextOut(60, 60, str, strlen(str)); // виведення тексту font1.DeleteObject(); // вилучення фізичного шрифту
Приклад програми із завантаженням логічного шрифту наведено у прикладі 4.4.
Приклад 4.4 – Програма із використанням логічного шрифту
// файл App.h class CApp: public CWinApp {public: BOOL InitInstance(); };
class CSDialog: public CDialog {public: void OnWrite(); BOOL OnInitDialog(); CSDialog(UINT id, CWnd *Owner): CDialog(id, Owner){} DECLARE_MESSAGE_MAP()
private: CEdit* ed; };
// файл App.cpp
#include < afxwin.h> #include < afxcmn.h> #include < afxdlgs.h> #include " App.h" #include " resource.h"
LOGFONT lf; char str[255]; CFont font1;
BOOL CApp:: InitInstance() {CSDialog a(IDD_DIALOG1, NULL); a.DoModal(); return TRUE; }
BEGIN_MESSAGE_MAP(CSDialog, CDialog) ON_COMMAND(IDC_BUTTON1, OnWrite) END_MESSAGE_MAP()
CApp App;
BOOL CSDialog:: OnInitDialog() {ed=(CEdit*)GetDlgItem(IDC_EDIT1); CFontDialog a; a.DoModal(); a.GetCurrentFont(& lf); return TRUE; }
void CSDialog:: OnWrite() {ed-> GetWindowText(str, sizeof(str)); if(str){CClientDC dc(this); font1.CreateFontIndirect(& lf); dc.SelectObject(font1); dc.TextOut(60, 60, str, strlen(str)); font1.DeleteObject(); }} Наведена програма функціонує у такий спосіб. Одразу після завантаження програми користувачу пропонується обрати тип та розмір шрифту. Як тільки це зроблено, завантажується діалогове вікно. Якщо у полі редагування набрати потрібний текст та натиснути кнопку “Write”, текст буде виведений у діалогове вікно обраним на початку програми шрифтом.
|