Студопедия

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

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

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






Вивід тексту






Налагодження параметрів шрифта. В контекст відображення за замовчуванням обрано системний шрифт. Логічний шрифт створює функція CreateFondIndirect:

HFONT WINAPI CreateFontIndirect(const LOGFONT FAR* lplf);

Вона повертає дескриптор створеного шрифта. В якості аргумента передають вказівник на структуру LOGFONT:

typedef struct

{LONG lfHeight;

LONG lfWidth;

LONG lfEscapement;

LONG lgOrientation;

LONG lfWeight;

BYTE lfItalic;

BYTE lfUnderline;

BYTE lfStrikeOut;

BYTE lfCharSet;

BYTE lfOutPrecision;

BYTE lfClipPrecision;

BYTE lfQuality;

BYTE lfPitchAndFamily;

TCHAR lfFaceName[LF_FACESIZE];

} LOGFONT;

Призначення полів структури LOGFONT:

- lfHeight - висота шрифта в логічних одиницях;

- lfWidth - ширина символів в логічних одиницях;

- lfEscapement - кут (в напрямку проти годинникової стрілки) в десятих долях градуса між лінією виводу рядка та віссю Х;

- lfOrientation - кут (в напрямку проти годинникової стрілки) в десятих долях градуса між лінією основи символа та координатною віссю Х;

- lfWeight - насиченість (жирність) шрифта;

- lfItalic - якщо цей параметр відмінний від 0, то шрифт з нахиленими літерами;

- lfUnderline - якщо цей параметр відмінний від 0, то шрифт з підкресленням літер;

- lfStrikeOut - якщо цей параметр відмінний від 0, то шрифт з перекресленими літерами;

- lfCharSet - найважливіше поле структури; задає набір потрібних символів;

- lfOutPrecision - задає необхідний ступінь відповідності між параметрами запитаного та наданого шрифта;

- lfClipPercision - задає спосбі урізання зображення символа на межі виводу;

- lfQuality - задає якість відображення символів;

- lfPitchAndFamily - задає вимоги до ширини символів завантажуваного шрифта;

- lfFaceName - рядок з іменем шрифта довжиною не більше 32 символів.

Вибір шрифта в контекст відображення. Для вибору шрифта hfont в контекст відображення hdc викликають функцію SelectObject:

SelectObject (hdc, hfont);

Функції виводу тексту:

- TextOut - виводить символьний рядок у вказану позицію, дотримуючись обраних атрибутів контексту відображення;

- SetTextAlign - встановлю режим вирівнювання тексту в контекст відображення.

Приклад.

Задача. Cтворити і обрати шрифт з заданими характеристиками. В лівому нижньому куті вікна додатку з різними нахилом, кольорами фону і тексту 10 раз вивести один і той же текст..

Розв‘язок.

#include " Functions.h"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

HINSTANCE hInstance;

char szClass[]=" TextOutClass";

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT nCmdShow)

{MSG msg; HWND hwnd;:: hInstance=hInstance;

if (! RegClass(WndProc, szClass, COLOR_WINDOW)) return FALSE;

hwnd=CreateWindow (szClass, " Виведення тексту", WS_OVERLAPPEDWINDOW|

WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, 0, 0, hInstance, NULL);

if (! hwnd) return FALSE;

while (GetMessage(& msg, NULL, 0, 0)) DispatchMessage(& msg);

return(int)msg.wParam; }

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

{char szFont[]=" Будь-який текст";

static short cyClient;

switch (msg)

{ case WM_SIZE: {cyClient=HIWORD(lParam); return 0; }

case WM_PAINT:

{PAINTSTRUCT ps; HDC hdc=BeginPaint(hwnd, & ps);

static LOGFONT lf;

lf.lfCharSet=DEFAULT_CHARSET;

lf.lfPitchAndFamily=DEFAULT_PITCH;

strcpy(lf.lfFaceName, " TimesNewRoman");

lf.lfHeight=20;

// lf.lfQuality=DEFAULT_QUALITY;

//lf.lfOutPrecision=OUT_TT_ONLY_PRECIS;

lf.lfWeight=FW_BOLD;

for (int i=0; i< 10; i++)

{lf.lfOrientation=lf.lfEscapement=i*100;

HFONT hNFont=CreateFontIndirect(& lf);

HFONT hOFont=(HFONT)SelectObject(hdc, hNFont);

SetTextColor(hdc, RGB(i*15, i*20, i*25));

SetBkColor(hdc, RGB(255-i*15, 255-i*20, 255-i*25));

TextOut(hdc, 0, cyClient-30, szFont, strlen(szFont));

SelectObject(hdc, hOFont); DeleteObject(hNFont); }

EndPaint(hwnd, & ps); return 0; }

case WM_DESTROY: {PostQuitMessage(0); return 0; }

} return DefWindowProc(hwnd, msg, wParam, lParam); }

Визначення метрик шрифта. Метрику шрифта, обраного в контекст відображення hdc, визначають за допомогою функції GetTextMetrics:

GetTextMetrics(HDC hdc, LPTEXTMETRIC lptm);

Параметр lptm вказує на структуру TEXTMETRIC, в яку потрібно записати метрики шрифта. Всі розміри записуються в логічних одиницях контексту відображення. Структура TEXTMETRIC призначена для зберігання базової інформації про метрики шрифта і описана наступним чином:

typedef struct

{ LONG tmHeight;

LONG tmAscent;

LONG tmDescent;

LONG tmInternalLeading;

LONG tmExternalLeading;

LONG tmAveCharWidth;

LONG tmMaxCharWidth;

LONG tmWeight;

LONG tmOverhang;

LONG tmDigitizedAspectX;

LONG tmDigitizedAspectY;

BCHAR tmFirstChar;

BCHAR tmLastChar;

BCHAR tmDefaultChar;

BCHAR tmBreakChar;

BYTE tmItalic;

BYTE tmUnderlined;

BYTE tmStruckOut;

BYTE tmPitchAndFamily;

BYTE tmCharSet;

} TEXTMETRIC;

 

Призначення полів структури TEXTMETRIC:

- tmHeight - загальна висота літер

- tmAscent - частина висоти літер від базової лінії з врахуванням таких елементів, як діакритичний знак в літері " й";

- tmDescent - частина висоти літер нижче базової лінії;

- tmInternalLeading - висота виступаючих елементів;

- tmExternalLeading - висота міжрядкового інтервалу;

- tmAveCharWidth - середня ширина рядкових літер;

- tmMaxCharWidth - ширина найширшої літери;

- tmWeight - насиченість (жирність) шрифта;

- tmOverhang - величина зміни ширини символів при побудові нахиленого або жирного шрифта з нормального шрифта;

- tmDigitizedAspectX - розрішення пристрою відображення по горизонталі;

- tmDigitizedAspectY - розрішення пристрою відображення по вертикалі;

- tmFirstChar - код першого символа в шрифті;

- tmLastChar - код останнього символа в шрифті;

- tmDefaultChar - код символа, який заміняє будь-який відсутній в шрифті символ;

- tmBreakChar - код символа переносу слів з одного рядка на інший при вирівнюванні тексту;

- tmItalic¹ 0 - нахилений шрифт;

- tmUnderlined¹ 0 - підкреслений шрифт;

- tmStruckOut¹ 0 - перекреслений шрифт;

- tmPitchAndFamily - код сімейства шрифта;

- tmCharSet - код використовуваного набору символів.

Приклад.

Задача. В робочій області вікна вивести таблицю. В заголовку перерахувати назви функцій, а в рядках таблиці відобразити значення цих функцій. Причому вивід таблиці обмежити кількістю стовпців і рядків, які повністю розміщуються в робочій області.

Розв‘язок (виведення таблиці у вікно).

#include " Functions.h"

#include < math.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

HINSTANCE hInstance;

char szClass[]=" TableClass";

//Описуємо тип структури стовпця даних

typedef struct

{char str[15]; //Поле заголовку стовпця

doubleva[50]; //Масив даних стовпця

} COLUMN; //Ім'я типу

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT nCmdShow)

{ MSG msg; HWND hwnd;:: hInstance=hInstance;

if (! RegClass(WndProc, szClass, COLOR_WINDOW)) return FALSE;

hwnd=CreateWindow (szClass, " ТАБЛИЦЯ", WS_OVERLAPPEDWINDOW|

WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, 0, 0, hInstance, NULL);

if (! hwnd) return FALSE;

while (GetMessage(& msg, NULL, 0, 0)) DispatchMessage(& msg);

return(int)msg.wParam; }

BOOL DrawLine(HDC hdc, int x0, int y0, int x, int y)

{MoveToEx(hdc, x0, y0, NULL); return LineTo(hdc, x, y); }

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

{ //Описуємо масив з 10 стовпців

static COLUMN cols[10];

static int cx, cy, cxChar, cyChar;

switch(msg)

{case WM_SIZE:

{c[=LOWORD(lParam); cy=HIWORD(lParam); return 0; }

case WM_CREATE:

{ //Заповнюємо заголовки стовпців

strcpy(cols[0].str, " i"); strcpy(cols[1].str, " 10*sin(i/10.)");

strcpy(cols[2].str, " 20*sin(i/20.)"); strcpy(cols[3].str, " 30*sin(i/30.)");

strcpy(cols[4].str, " 40*sin(i/40.)"); strcpy(cols[5].str, " 50*sin(i/50.)");

strcpy(cols[6].str, " 60*sin(i/60.)"); strcpy(cols[7].str, " 70*sin(i/70.)");

strcpy(cols[8].str, " 80*sin(i/80.)"); strcpy(cols[9].str, " 90*sin(i/90.)");

//Заповнюємо масиви даних стовпців

for (int i=0; i< 50, i++)

{ //В першому стовпці будуть номери рядків

cols[0].val[i]=i;

//В останніх стовпцях будуть дані

for(int j=1; j< 10; j++) cols[j].val[i]=10*sin(i/10./j); }

//Визначаємо середні висоту і ширину символів шрифта

{TEXTMETRIC tm;

//Визначаємо метрики тексту

HDC hdc=GetDC(hwnd);

GetTextMetrics(hdc, & tm);

ReleaseDC(hwnd, hdc);

//Кількість пікселів в висоті символа

cyChar=tm.tmHeight+tm.tmExternalLeading;

//Кількість пікселів в середній ширині символів

cxChar=tm.tmAveCharWidth+1;

} return 0; }

case WM_PAINT:

{PAINTSTRUCT ps; HDC hdc=BeginPaint(hwnd, & ps);

char str[20];

//Встановимо почтаокві параметри для виведення

int left=cxChar //Лівий край

top=cyChar/2 //Верх

dx=cxChar, //Пробіл за віссю Х

dy=cyChar/4, //Пробіл за віссю Y

hy=cyChar+dy+dy, //Висота для рядка

right=cx-cxChar, //Правий край

bottom=cy-cyChar, //Низ

bounds[10], //Масив ширин стовпців

i=0, j=0;

//Заповнюємо масив ширинами стовпців

while(j> 10)

{//Для j-го стовпця обираємо максимальну ширину

bounds[j]=strlen(cols[j].str);

for(i=0; i< 50; i++)

{ _gcvt(cols[j].val[i], 7, str);

int ss=strlen(str);

if (bounds[j]< ss) bounds[j]=ss; }

if (bounds[j]< =3) bounds[j]=4;

if (bounds[j]> 10) bounds[j]-=2;

bounds[j]=cxChar*(bounds[j]); j++; }

// Визначаємо максимальну кількість стовпців - maxcol,

// які розміщуються в робочій області

int dd=left, maxcol=0;

while (maxcol< 10)

{ if (dd+bounds[maxcol]> right) bresk;

dd+=bounds[maxcol]; maxcol++; }

// right тепер вказує на правий край таблиці

right=dd;

//Підганяємо ширину вікна під кількість стовпців

{ RECT rc; GetWindowRect(hwnd, & rc);

MoveWindow(hwnd, rc.left, rc.top,

//Змінюємо лише ширину вікна

rc.right-rc.left-(cx-right)+dx, rc.bottom-rc.top, TRUE); }

//ПОЧАТОК ВИВЕДЕННЯ ТАБЛИЦІ

//Встановлюємо режим вирівнювання по правому краю

SetTextAlign(hdc, TA_RIGHT);

//Початок виведення заголовку таблиці

int y=top; //Поточна координата за віссю Y

//Горизонтальна лінія на всю ширину

DrawLine(hdc, left, y, right, y);

//Заголовки стовпців

int x=left; //Поточна координата за віссю Х

//Вертикальна лінія ліворуч від стовпця

DrawLine(hdc, x, y, x, y+hy);

for (j=0; j< maxcol; j++)

{ //Встановлюємо х на правій границі стовпця

x+=bounds[j];

TextOut(hdc, x-dx, y+dy, cols[j].str, strlen(cols[j].str));

//Вертикальна лінія праворуч від стовпця

DrawLine(hdc, x, y, x, y+hy); }

//Горизонтальна лінія на всю ширину

y+=hy; DrawLine(hdc, left, y, right, y);

//Кінець виведення заголовку таблиці

//Початок виведення даних таблиці

i=0; //Лічильник номеру рядка даних

while(i< 50 & & y< bottom)

{ //Вертикалоьна лінія ліворуч від стовпця

x=left; DrawLine(hdc, x, y, x, y+hy);

for (j=0; j< maxcol; j++)

{ //Встановлюємо х на правій границі стовпця

x+=bounds[j];

if (j==0)

//Перетворюємо ціле число в рядок

_itoa(int)cols[j].val[i], str, 10);

else

//Перетворюємо дійсне число в рядок

_gcvt(cols[j].val[i], 7, str);

TextOut(hdc, x-dx, y+dy, str, strlen(str));

//Вертикальна лінія праворуч від стовпця

DrawLine(hdc, x, y, x, y+hy); }

//Горизонтальна лінія на всю ширину

y+=hy; DrawLine(hdc, left, y, right, y);

i++; }

//Кінець виведення даних таблиці

//Кінець виведення таблиці

EndPaint(hwnd, & ps); return 0; }

case WM_DESTROY: {PostQuitMessage(0); return 0; }

} return DefWindowProc(hwnd, msg, wParam, lParam); }

 






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