Теоретичні відомості:
Все, що повязано з малюванням та виведенням тексту вікна, по можливості обробляється в блоці повідомлення 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.