Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
API_LAB.doc
Скачиваний:
2
Добавлен:
06.05.2019
Размер:
485.38 Кб
Скачать

Теоретичні відомості:

Все, що повязано з малюванням та виведенням тексту вікна, по можливості обробляється в блоці повідомлення WM_PAINT.

В роботі слід вивести текст у вікно. Для того, щоб програма зрозуміла, що малювати слід саме у даному конкретному вікні (одна програма може мати десятки вікон), слід виділлити контекст графічного пристрою HDC. В усіх графічних функціях перший аргумент - контекст.

API дає можливість вивести текст де завгодно, будь-якого кольору, розміру, шрифту.

Відома функція TextOut(), виводить текстовий рядок в заданих координатах. Саме вона виводила текст в лабораторній №2: "Hello, Win32 API!!!". Синтаксис цієї функції:

BOOL TextOut(HDC hdc, int x, int y, LPCTSTR lpString, int cbString);

Аргументы:

1. hdc - контекст графічного пристрою;

2. x ,y - координаты тексту, відлік яких ведеться від лівого верхнього кута вікна донизу і праворуч.

3. lpString - сам текст

4. cbString – довжина рядка. Якщо треба вивести весь рядок, можна вказати strlen(lpString).

Один з способів встановлення шрифту у WinAPI: заповнення структури LOGFONT, яка має велику кількість полів. Деякі з них:

lfCharSet - задає набір потрібних символів (кодування). Може приймати одне з значень: OEM_CHARSET, ANSI_CHARSET тощо. Це необхідно якщо, наприклад, буде виводитись текст не лише англійською мовою. При написанні програм з повідомленнями кирилицею слід встановити кодування DEFAULT_CHARSET, таким чином якщо у користувача встановлена українська мова в операційній системі, текст буде відображатися коректно.

lfPitchAndFamily - задає ширину символів і визначає родину шрифтів. З значенням параметру:

DEFAULT_PITCH - не має значення, чи має шрифт змінну чи фіксовану ширину,

FIXED_PITCH - ширина символів чітко фіксована;

VARIABLE_PITCH - ширина змінна;

lfHeight - висота шрифта;

lfWidth - ширина символів, якщо жирний шрифт, то слід вказати, наскільки жирний;

lfItalic – якщо це поле не 0, шрифт буде курсивний;

lfUnderline - якщо це поле не 0, шрифт буде підкреслений;

lfFaceName - імя шрифту

Після заповнення полів LOGFONT посилання на структуру передається функції CreateFontIndirect, яка повертає дескриптор створеного шрифту hfont:

static LOGFONT lf; //створення екземпляру структури LOGFONT

lf.lfCharSet=DEFAULT_CHARSET; //заповнення полів

lf.lfPitchAndFamily = DEFAULT_PICH;

...

HFONT hFont;

hFont=CreateFontIndirect(&lf); //передача посилання на структуру

SelectObject(hdc, hFont); //шрифт слід зробити поточним

TextOut(hdc, 10,10, str, strlen(str)); //виведення тексту вибраним шрифтом

Лістинг програми:

//lab3.cpp

#include<windows.h>

#include<tchar.h>

const wchar_t szTitle[]=_T("ЗПЗС-114 Лаб№3 Вариницький С.В.");

const wchar_t szProgName[]=_T("Лаб№3");

const wchar_t szIconName[]=_T("IDI_MYICON");

const wchar_t szCursorName[]=_T("IDC_MYCURSOR");

HINSTANCE ghInstance;

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

ATOM MyRegisterClass(HINSTANCE hInstance);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)

{

HWND hWnd; MSG lpMsg;

ghInstance = hInstance;

WNDCLASS w;

w.style = CS_HREDRAW|CS_VREDRAW;

w.lpfnWndProc = WndProc;

w.cbClsExtra = 0;

w.cbWndExtra = 0;

w.hInstance = hInstance;

w.hIcon = LoadIcon(hInstance, szIconName);

w.hCursor = LoadCursor(hInstance, szCursorName);

w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

w.lpszMenuName = 0;

w.lpszClassName = szProgName;

if(!RegisterClass(&w)) {

MessageBox(NULL, _T("Can't register class"), _T("Error"), MB_OK); return 0;

}

hWnd = CreateWindow(szProgName, szTitle, WS_OVERLAPPEDWINDOW,100, 100, 700, 500, (HWND)NULL, (HMENU)NULL,(HINSTANCE)hInstance, (LPVOID) NULL);

if(!hWnd) {

MessageBox(NULL, _T("Can't create window"), _T("Error"), MB_OK); return 0;

}

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

while(GetMessage(&lpMsg, hWnd, 0, 0)) {

TranslateMessage(&lpMsg);

DispatchMessage(&lpMsg);

}

return lpMsg.wParam;

}

void outPicture(HDC hdc, int x, int y, wchar_t st[]) {

HDC hmdc; HBITMAP hBitmap; BITMAP bm;

hBitmap = LoadBitmap(ghInstance, st); //Зв’язування

hmdc=CreateCompatibleDC(hdc); //Створення контексту памяті

SelectObject(hmdc, hBitmap); //Вибір об’єкту картинки

GetObject(hBitmap, sizeof(bm), (LPSTR) &bm); //отримуємо висоту і ширину картинки

BitBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, hmdc, 0,0, SRCCOPY); //Виведення картинки на екран в точку 10, 10 з пам’ятi (hmdc)

DeleteDC(hmdc); //видалення контексту з пам’яті

}

void setFont (HDC hdc, wchar_t fName[], LONG lfHeight, LONG lfWidth, BYTE lfItalic, BYTE lfUnderline, BYTE lfStrikeOut, LONG lfEscapement) {

LOGFONT lf;

HFONT hFont;

lf.lfCharSet=DEFAULT_CHARSET;

lf.lfPitchAndFamily=DEFAULT_PITCH;

lstrcpyW(lf.lfFaceName, fName);

lf.lfHeight=lfHeight;

lf.lfWidth=lfWidth;

lf.lfItalic=lfItalic;

lf.lfUnderline=lfUnderline;

lf.lfStrikeOut=lfStrikeOut;

lf.lfEscapement=lfEscapement;

hFont = CreateFontIndirect(&lf);

SelectObject(hdc, hFont);

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam)

{

HDC hdc; PAINTSTRUCT ps;

switch(messg)

{

case WM_PAINT :

hdc=BeginPaint(hWnd, &ps);

setFont(hdc, _T("Times New Roman"), 10, 6, 0, 1, 0, 0);

TextOut(hdc, 70,0, _T("Tool Bar"), strlen("Tool Bar"));

outPicture(hdc, 0, 10, _T("IDB_IM"));

setFont(hdc, _T("Arial"), 20, 10, 1, 0, 0, 0);

SetTextColor(hdc, RGB(200,100,255));

TextOut(hdc, 90,35, _T("'2 бубни'"), strlen("'2 бубни'"));

outPicture(hdc, 50, 55, _T("IDB_2B"));

setFont(hdc, _T("Calibri"), 20, 10, 0, 0, 1, 0);

SetTextColor(hdc, RGB(200,155,100));

TextOut(hdc, 310,35, _T("'5 треф'"), strlen("'5 треф'"));

outPicture(hdc, 250, 55, _T("IDB_5T"));

setFont(hdc, _T("Times New Roman"), 30, 10, 0, 1, 0, 0);

SetTextColor(hdc, RGB(255,70,100));

TextOut(hdc, 490,25, _T("'10 пік'"), strlen("'10 пік'"));

outPicture(hdc, 450, 55, _T("IDB_10P"));

setFont(hdc, _T("Calibri"), 30, 20, 0, 0, 0, 900);

SetTextColor(hdc, RGB(0,0,0));

TextOut(hdc, 8,470, _T("Вариницький С.В."), strlen("Вариницький С.В."));

ValidateRect(hWnd, NULL);

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, messg, wParam, lParam);

}

return 0;

}

//lab3.rc

#include "windows.h"

IDI_MYICON ICON "ico.ico"

IDC_MYCURSOR CURSOR "c.cur"

IDB_IM BITMAP "pr2.bmp"

IDB_2B BITMAP "2B.bmp"

IDB_5T BITMAP "5T.bmp"

IDB_10P BITMAP "10P.bmp"

Вікно результату:

Висновок:

Під час даної лабораторної роботи були змінені параметри шрифту засобами API.

Лабораторна робота №4

Тема: Створення меню вікна. Створення ресурсу меню.

Мета: Навчитись створювати меню вікна засобами API.