Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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]

Режим Коментар
BLACKNESS здійснює вивід чорним кольором у цільове растрове зображення
DSTINVERT інвертує цільове растрове зображення
MERGECOPY об’єднує растр рисунка з початковим растровим зображенням логічною операцією AND
MERGEPAINT об’єднує растр рисунка з початковим растровим зображенням логічною операцією OR
NOTSRCCOPY інвертує початкове растрове зображення й копіює його у місце призначення
NOTSRCERASE об’єднує цільове та початкове растрові зображення, використовуючи логічний оператор OR, а потім інвертує результат
PATCOPY копіює рисунок у цільове растрове зображення
PATINVERT об’єднує цільове растрове зображення з рисунком, використовуючи логічний оператор XOR
PATPAINT Інвертує початкове растрове зображення, об’єднує його з рисунком, використовує логічний оператор OR, а потім об’єднує результат з цільовим растровим зображенням, використовуючи логічний оператор OR
SRCAND об’єднує цільове та початкове зображення, використовуючи логічний оператор AND
SRCCOPY копіює початкове растрове зображення у цільовий растр без змін
SRCERASE об’єднує інвертоване цільове растрове зображення з початковим растром, використовуючи логічний оператор AND
SRCINVERT об’єднує цільове та початкове растрові зображення, використовуючи логічний оператор XOR
SRCPAINT об’єднує цільове та початкове растрові зображення, використовуючи логічний оператор OR
WHITENESS створює вивід білим кольором у цільове растрове зображення

 

Необхідно пояснити ще одну особливість виведення зображень. Об’єкт 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 для отримання розмірів екрана
SM_CLEANBOOT Визначає як стартувала система: 0 – нормальний запуск; 1 – у режимі захисту від збоїв; 2 - у режимі захисту від збоїв з мережі.
SM_CMONITORS кількість моніторів у системі
SM_CMOUSEBUTTONS кількість кнопок миші, або 0, якщо миші нема
SM_CXSCREENSM_CYSCREEN ширина та висота екрана основного монітора системи у пікселях
SM_NETWORK не рівний 0, якщо система під’єднана до мережі комп’ютерів
SM_CXFULLSCREENSM_CYFULLSCREEN Визначає ширину та висоту робочої області вікна програми, розвернутого на весь екран

 

Розглянувши всі зазначені функції можна перейти до прикладу програми, що виводить текст із інформацією про наявні характеристики шрифту. Програма не визначає шрифт, а використовує системні настройки (системний шрифт).

Знову таки, суттєвим недоліком програми є втрата виведеної інформації після операцій із вікном.

Приклад 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”, текст буде виведений у діалогове вікно обраним на початку програми шрифтом.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.