- •Хмельницький національний університет проектування інтерфейсів користувача
- •Хмельницький 2009
- •Лабораторна робота №1
- •І. Теоретичні відомості
- •Для розробника вікно є сукупністю великої кількості елементів, які функціонують під управлінням додатку та операційної системи.
- •Створення вікон
- •Головна функція додатку
- •Структура тексту додатку
- •Допоміжні функції створення вікон
- •Приклади створення вікон
- •IV. Контрольні питання
- •Лабораторна робота №2
- •І. Теоретичні відомості
- •Статичний орган управління
- •Смуги прокрутки
- •IV. Контрольні питання
- •Лабораторна робота №3
- •І. Теоретичні відомості
- •Списки рядків
- •Комбінований список
- •IV. Контрольні питання
- •Лабораторна робота №4
- •І. Теоретичні відомості
- •Повідомлення wm_paint
- •Види контексту відображення
- •Встановлення атрибутів контексту відображення
- •Вивід тексту
- •Малювання геометричних фігур
- •IV. Контрольні питання
- •Лабораторна робота №5
- •І. Теоретичні відомості
- •Інструменти малювання
- •Відображення графічних об'єктів
- •IV. Контрольні питання
- •Лабораторна робота №6
- •І. Теоретичні відомості
- •Створення меню
- •Повідомлення від меню
- •Плаваюче меню
- •Акселератори
- •IV. Контрольні питання
- •Література
IV. Контрольні питання
В чому перевага використання комбінованого списка в порівнянні із звичайним списком?
Що буде, якщо при створенні комбінованого списка другим аргумнтом вказати на деякий рядок?
Які органи управління не використовують ідентифікатори?
Які органи управління і в якому випадку не використовують дескрипторів вікон?
Які основні етапи створення орагнів управління?
Лабораторна робота №4
Тема: ІнтерфейсGDI: Виведення у вікно.Види контекста відображення. Атрибути контексту відображення. Виведення тексту. Створення геометричних фігур.
Мета: Знайомство з організацією виведення у вікно. Ознайомлення з видами і атрибутами контексту відображення, творенням геометричних фігур.
І. Теоретичні відомості
Виведення у вікно
Виведення у вікно має наступні особливості:
В системі Windows додатки виводять одночасно в різні вікна. Система сама вирішує проблеми перекриття та пересувань вікон. В цьому зв'язку виведення у вікно розробник прагне описувати в одному місці додатку - при обробці повідомлення WM_PAINT, щоб при надходженні повідомлення WM_PAINT функція вікна могла перемалювати вікно.
Інтерфейс графічних пристроїв (Graphics Device Interface - GDI) системи відкриває доступ до великої кількості функцій виведення. Додатки, звертаючись до функцій GDI, працюють не з фізичними, а з логічними пристроями виведення, і опис виклику функцій не залежить від фізичного способу відображення.GDIпередає вказівки про вивід драйверу пристроя відображення. Драйвер працює безпосередньо з фізичним пристроєм та при управлінні відображенням враховує його можливості та особливості. Тому додатки можуть працювати з будь-яким пристроєм відображення, драйвер якого встановлено в системі.
Параметри виводу встановллють в контексті відображення за допомогою функцій GDI. Контекст відображення - це структура даних, яка містить характеристики пристрою відображення та вказівники на обрані інструменти малювання. ФункціїGDIвикористовуютть лише обрані в контекст відображення параметри і інструменти малювання.
Дескриптор контексту відображення служить першим аргументом виклику всіх функцій, пов'язаних з виводом у вікно.
Повідомлення wm_paint
Прагнення виводити у вікно при обробці повідомлення WM_PAINT пояснюють наступним. Windows стежить за розташуванням вікон і при необхідності перемалювання надсилає повідомлення WM_PAINT функції вікна. Функція вікна при обробці цього повідомлення перемальовує все вікно або вказані частини.
Повідомлення WM_PAINTобробляють наступним чином:
case WM_PAINT:
{PAINTSTRUCT ps;
HDC hdc=BeginPaint(hwnd, &ps);
//Тут налагоджують контекст відображення і виводять у вікно
EndPaint(hwnd,&ps);
return 0; }
Структура PAINTSTRUCT описана наступним чином:
Typedef struct
{ HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[16];
} PAINTSTRUCT;
Приклад.
Задача. В центрі робочої області вікна вивести текст..
Розв‘язок.
#include "Functions.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInstance;
Char szClass[]="OutputClass";
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,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, 0, 0, hInstance, NULL);
if (!hwnd) return FALSE;
ShowWindow(hwnd,SW_SHOWMAXIMIZED); UpdateWindow(hwnd);
while(GetMessage(&msg, NULL, 0, 0)) DispatchMessage (&msg);
return (int) msg.wParam; }
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{ char szText[]="Виводимо бдь-який текст";
static short cx, cy;
switch(msg)
{case WM_SIZE:
{cx=LOWORD(lParam); cy=HIWORD(lParam); return 0; }
case WM_PAINT:
{PAINTSTRUCT ps;
HDC hdc=BeginPaint(hwnd,&ps);
SetTextColor(hdc, RGB(255,0,0));
SetBkColor(hdc, RGB(0,255,255));
SetTextAlign(hdc, TA_CENTER);
TextOut(hdc, cx/2, cy/2, szText, strlen(szText));
EndPaint(hwnd, &ps);
return 0; }
case WM_DESTROY: {PostQuitMessage(0); return 0; }
} return DefWindowProc(hwnd, msg, wParam. LParam); }
В стилі класу вікна (функція RegClass в Functions.cpp), яке обробляє повідомлення WM_PAINT, вказують, що воно повинно перемальовувати вміст при зміні розмірів вікна:
wc.style=CS_HREDRAW | CS_VREDRAW;
Вікна класу з таким стилем при зміні розмірів автоматично одержують повідомлення WM_PAINT.
При обробці повідомлення WM_PAINTдодались оператори налагодження атрибутів контексту відображення і виводу у вікно/
Якщо вміст вікна потрібно оновити при обробці іншим повідомленням, то функції вікна потрібно передати повідомлення WM_PAINT. Одна з функцій, які надсилають повідомлення WM_PAINT, - це функція UpdateWindow().
Приклад.
Задача. В центрі робочої області вікна вивести рядок "Текст за замовчуванням". Після натискання лдівої кнопки миші вміст цього рядка замінити текстом "Натиснута ліва кнопка миші".
Розв‘язок (перемалювання вікна після натискання лівої кнопки миші).
#include "Functions.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInstance;
char szClass[]="OutputClass";
char szText[50]="Текст за замовчуванням";
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)
{ static short cx, cy;
switch(msg)
{case WM_SIZE:
{cx=LOWORD(lParam); cy=HIWORD(lParam); return 0; }
case WM_PAINT:
{PAINTSTRUCT ps;
HDC hdc=BeginPaint(hwnd,&ps);
SetTextColor(hdc, RGB(255,0,0));
SetBkColor(hdc, RGB(0,255,255));
SetTextAlign(hdc, TA_CENTER);
TextOut(hdc, cx/2, cy/2, szText, strlen(szText));
EndPaint(hwnd, &ps);return 0; }
case WM_LBUTTONDOWN:
{strcpy(szText, "Натиснуто ліву кнопку миші");
InvalidateRect(hwnd, NULL, TRUE); return 0; }
case WM_DESTROY: {PostQuitMessage(0); return 0; }
} return DefWindowProc(hwnd, msg, wParam. lParam); }