Теоретичні відомості:
Все, що повязано з малюванням та виведенням тексту вікна, по можливості обробляється в блоці повідомлення 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)); //виведення тексту вибраним шрифтом
Лістинг програми:
#include<windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT messg,
WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
LOGFONT lf;
HFONT hFont;
switch(messg)
{
case WM_PAINT :
hdc=BeginPaint(hWnd, &ps);
//Создаём свой шрифт
strcpy(lf.lfFaceName,"Times New Roman");
lf.lfHeight=20;
lf.lfItalic=1;
lf.lfStrikeOut=0;
lf.lfUnderline=0;
lf.lfWidth=10;
lf.lfWeight=20;
lf.lfCharSet=DEFAULT_CHARSET;
lf.lfPitchAndFamily=DEFAULT_PITCH;
lf.lfEscapement=900;
hFont = CreateFontIndirect(&lf);
SelectObject(hdc, hFont);
SetTextColor(hdc, RGB(0,0,100));
TextOut(hdc,80,280, "Коренюк Марк!!!", 15);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, messg, wParam, lParam)); //освобождаем очередь приложения от нераспознаных
}
return 0;
}
char szProgName[]="Ім’я программы";
char szIconName[]="IDI_MYICON"; //тут додана іконка
char szCursorName[]="IDC_MYCURSOR"; // тут доданий курсор
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
HWND hWnd;
MSG lpMsg;
WNDCLASS w; //створення екземпляру структури WNDCLASS
//її заповнення
w.hbrBackground = CreateSolidBrush(RGB(50,50,100));
w.lpszClassName=szProgName; //ім’я програми - оголошено вище
w.hInstance=hInstance; //ідентифікатор поточного додатку
w.lpfnWndProc=WndProc; //вказівник на функцію вікна
w.hCursor=LoadCursor(hInstance, szCursorName); //завантаження курсору
w.hIcon=LoadIcon(hInstance, szIconName); // завантаження іконки
w.lpszMenuName=0; // меню поки немає
//w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //колір фону вікна
w.style=CS_HREDRAW|CS_VREDRAW; //стиль - перемалювання по х і по у
w.cbClsExtra=0;
w.cbWndExtra=0;
if(!RegisterClass(&w))
return 0;
hWnd=CreateWindow(szProgName, //імя програми
"Міняємо іконку і курсор!", //Заголовок окна
WS_OVERLAPPEDWINDOW, //Стиль вікна - перекриває
100, //положення вікна на екрані по х
100, // положення по у
500, //ширина
400, //висота
(HWND)NULL, //ідентифікатор батьківського вікна
(HMENU)NULL, // ідентифікатор меню
(HINSTANCE)hInstance, // ідентифікатор екземпляру програми
(HINSTANCE)NULL); //відсутність додаткових параметрів
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&lpMsg, NULL, 0, 0)) { //отримання повідомлення з черги
TranslateMessage(&lpMsg); //перетворення повідомлень клавіш у символиы
DispatchMessage(&lpMsg); //Передає повідомлення відповідній функції вікна
}
return(lpMsg.wParam);
}
Вікно результату:
Висновок:
Під час даної лабораторної роботи були змінені параметри шрифту засобами API.
Лабораторна робота №4
Тема: Створення меню вікна. Створення ресурсу меню.
Мета: Навчитись створювати меню вікна засобами API.