- •Хмельницький національний університет проектування інтерфейсів користувача
- •Хмельницький 2009
- •Лабораторна робота №1
- •І. Теоретичні відомості
- •Для розробника вікно є сукупністю великої кількості елементів, які функціонують під управлінням додатку та операційної системи.
- •Створення вікон
- •Головна функція додатку
- •Структура тексту додатку
- •Допоміжні функції створення вікон
- •Приклади створення вікон
- •IV. Контрольні питання
- •Лабораторна робота №2
- •І. Теоретичні відомості
- •Статичний орган управління
- •Смуги прокрутки
- •IV. Контрольні питання
- •Лабораторна робота №3
- •І. Теоретичні відомості
- •Списки рядків
- •Комбінований список
- •IV. Контрольні питання
- •Лабораторна робота №4
- •І. Теоретичні відомості
- •Повідомлення wm_paint
- •Види контексту відображення
- •Встановлення атрибутів контексту відображення
- •Вивід тексту
- •Малювання геометричних фігур
- •IV. Контрольні питання
- •Лабораторна робота №5
- •І. Теоретичні відомості
- •Інструменти малювання
- •Відображення графічних об'єктів
- •IV. Контрольні питання
- •Лабораторна робота №6
- •І. Теоретичні відомості
- •Створення меню
- •Повідомлення від меню
- •Плаваюче меню
- •Акселератори
- •IV. Контрольні питання
- •Література
Приклади створення вікон
Заборона запуску другого екземпляру додатку
#include “Functions.h”
//Оголошення функцій
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInstance;
//Опис імен класу і заголовку вікна додатку
char const szMainClass[]=”MainClass”;
char szTitle[]=”Приклад”;
//Головна функція додатку
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, PSTR, INT nCmdShow)
{MSG msg; hInstance=hInst;
HWND hwnd=FindWindow(szMainClass, szTitle);
if(hwnd)
{MessageBox(hwnd, “Можна запускати лише один екземпляр додатку!\n” “Пересувається на передній план перший екземпляр”, szTitle, MB_OK|MB_ICONSTOP);
//Якщо вікно згорнуте, відновлюємо
If (IsIconic (hwnd)) ShowWindow(hwnd,SW_RESTORE);
SetForegroundWindow(hwnd);
return 0;}
if(!RegClass(WndProc, szMainClass,COLOR_BACKGROUND))return FALSE;
hwnd=CreateWindow(szMainClass, szTitle,
WS_POPUPWINDOW|WS_CAPTION|WS_MINIMIZEBOX, 0, 0, 0, 0, 0, 0, hInstance, NULL);
if(!hwnd) return FALSE;
ShowWindow(hwnd,SW_MAXIMIZE);
while(GetMessage(&msg,NULL,0,0)) DispatchMessage(&msg);
return(int)msg.wParam;}
//Функція вікна додатку
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{switch (msg)
{case WM_DESTROY:
{PostQuitMessage(0);
return 0;}
} return DefWindowProc(hwnd,msg,wParam,lParam);}
Задача. В правому нижньому куті робочої області вікна додатку при першому натисканні лівої клавіші миші відобразити вікно із заголовком “1-е вікно”, при другому натисканні – вікно із заголовком “2-е вікно”, і так до 5 вікон. Починаючи з 2-го, вікна розташовувати під попереднім, зсуваючи вгору і ліворуч так, щоб було видно заголовок, а лівий верхній кут 5-го вікна повинен співпадати з лівим верхнім кутом робочої області вікна додатку. Якщо якісь з цих вікон закриті, то при натисканні лівої кнопки миші повинно бути створене перше з закритих вікон. (Так зване розташування вікон черепицею в зворотньому порядку).
Розв’язок.
#include “Functions.h”
LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK WndPopup (HWND,UINT,WPARAM,LPARAM);
HINSTANCE hInstance;
char const szMainClass[]=”MainClass”;
char const szPopupClass[]=”PopupClass”;
char const szTitle[]=”Приклад”;
INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,PSTR,INT nCmdShow)
{MSG msg; HWND hwnd; hInstance hInst;
if (!RegClass(WndProc,szMainClass,COLOR_WINDOW)) return FALSE;
if (!RegClass(WndPopup,szPopupClass,COLOR_BTNFACE)) return FALSE;
hwnd=CreateWindow(szMainClass,szTitle,
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 cxClient, cyClient, yStep, xStep, left, top, Width, Height;
// Описуємо масив дескрипторів вікон
static HWNSD hwnds[5];
switch(msg)
{case WM_CREATE:
{//Висота заголовку або зміщення вікон по вертикалі
yStep=GetSystemMetrics(SM_CYCAPTION);
return 0;}
case WM_MOVE:
{//Лівий верхній кут робочої області
left=LOWORD(lParam); top=HIWORD(lParam);
//Пересуваємо існуючі тимчасові вікна
for(short j=0;j<5,j++)
if (IsWindow(hwnds[j]))
MoveWindow(hwnds[j],left+cxClient-Width-xStep*j,
top+cyClient-Height-yStep*j,
Width,Height,TRUE);
return 0;}
case WM_SIZE:
{//Ширина і висота робочої області
cxClient=LOWORD(lParam); cyClient=HIWORD(lParam);
//Ширина і висота тимчасових вікон
Width=cxClient/2; Height=cyClient-4*yStep;
//Зміщення вікон по горизонталі
xStep=(cxClient-Width)/4;
//Пересуваємо існуючі тимчасові вікна
for (short j=0;j<5,j++)
if (IsWindow(hwnds[j]))
MoveWindow(hwnds[j],left+cxClient-Width-xStep*j;
top+cyClient-Height-yStep*j,
Width,Height,TRUE);
return 0;}
case WM_LBUTTONDOWN:
{//Шукаємо вільне місце в масиві дескрипторів вікон
for (short j=0; j<5, IsWindow(hwnds[j]);j++);
//Якщо немає вільного місця, повертаємось
if (j>4) return 0;
//Формуємо заголовок вікна
char str[20]; _itoa(j+1, str, 10); strcat(str,"-е вікно");
//Створюємо -j-е тимчасове вікно
hwnds[j]=CreateWindow(szPopupClass,str,
WS_POPUPWINDOW|WS_CAPTION|WS_VISIBLE,
left+cxClient-Width-xStep*j, //Коордната лівого краю
top+cyClient-Height-yStep*j, //Координата верхнього краю
Width, Height, hwnd, 0, hInstance, NULL);
//Якщо створено не перше вікно, пересуваємо його донизу
if (j>0)
{SetWindowPos(hwnds[j],hwnds[j-1],0,0,Width,Height,
SWP_NOMOVE|SWP_NOSENDCHANGING);
//Переміщуємо на передній план перше вікно
SetForegroundWindow(hwnds[0]);
} return 0; }
case WM_DESTROY:
{PostQuitMessage(0); return 0; } }
return DefWindowProc (hwnd, msg, wParam, lParam); }
LRESULT CALLBACK WndPopup(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{return DefWindowProc(hwnd, msg, wParam, lParam); }
IІ. ЗМІСТ ЗВІТУ
Тема, мета, умова завдання.
Опис команд, за допомогою яких було виконано завдання, і результатів їх виконання.
Висновок.
ІІІ. ЗАВДАННЯ
Написати програму мовою програмування C++ для реалізації завдання згідно варіанту.
Правий верхній кут робочої області вікна додатку займає тимчасове вікно розміром в чверть цієї області. Після натискання правої кнопки миші над робочою областю вікна додатку тимчасове вікно згортається в піктограму в лівому нижньому куті, а після антискання лівої – розгортається в правому верхньому куті робочої області.
Після натсикання на ліву кнопку миші над робочою областю вікна в лівому верхньому куті цієї області відобразити тимчасове вікно розміром в чверть області. Тимчасове вікно приховати після відпускання клавіші в будь-якому місці екрану.
Після натсикання на праву кнопку миші над робочою областю вікна в правому нижньому куті цієї області відобразити тимчасове вікно розміром в чверть області. Тимчасове вікно приховати після відпускання клавіші в будь-якому місці екрану.
В лівому верхньому куті робочої області вікна створити тимчасове і дочірнє вікна. Після натискання лівої кнопки миші 4 рази “блимає” тимчасове вікно, а після натискання правої – 3 рази “блимає” дочірнє вікно, видаючи різні звукові сигнали.
В правому нижньому куті робочої області вікна створити тимчасове і дочірнє вікна. Після натискання лівої кнопки миші 4 рази “блимає” тимчасове вікно, а після натискання правої – 3 рази “блимає” дочірнє вікно, видаючи різні звукові сигнали.
Створити вікно додатку розміром в одну шістнадцяту площі екрану з заголовком “Форматування диску” без кнопок зміни розмірів, закриття та згортання в піктограму і без кнопки системного меню. При переміщенні курсору миші над робочою областю вікно повинно “тікати” від курсору миші у випадковим чином обраному напрямку, залишаючись в межах екрану.
В центрі робочої області вікна розташоване вікно без заголовка з вертикальною та горизонтальною смугами перегляду розміром в чверть робочої області. Після клацання кнопкою миші в різних місцях екрану тимчасове вікно видає різний звуковий сигнал.
При запуску і-го екземпляра (i>2) додатку запитати користувача, чи потрібно його запустити. Якщо користувач відповість “Так”, то запустити його. Інакше на передній план помістити 2-й екземпляр додатку і завершити роботу і-го екземпляру.
Кути робочої області вікна додатку повністю займають 4 тимчасових вікна одного класу. Якщо натиснути ліву кнопку миші над тимчасовим вікном, то це вікно видає повідомлення про свій заголовок.
Вікно додатку без заголовка займає весь екран фоном робочого столу.
В центрі робочої області вікна розташовується невидиме вікно без заголовка розміром в чверть площі робочої області. Після натискання лівої кнопки миші над робочою областю будь-якого з вікон вікно без заголовку повинно стати видимим, а після натискання правої – невидимим.
В центрі робочої області вікна відображене дочірнє вікно з фоном кольору тривимірних елементів з вертикальною і горизонтальною смугами перегляду розміром в чверть цієї області. Дочірнє вікно пересувається в той кут робочої області, де натиснули ліву кнопку миші.
В лівому верхньому куті робочої області вікна створити тимчасове вікно площею в одну шістнадцяту площі цієї області. При натисканні на ліву кнопку миші тимчасове вікно пересунути в сусідній за годинниковою стрілкою кут робочої області.
В лівому верхньому куті робочої області вікна створити тимчасове вікно площею в одну шістнадцяту площі цієї області. При натисканні на праву кнопку миші тимчасове вікно пересунути в сусідній проти годинникової стрілки кут робочої області.
Створити вікно розміром в чверть площі екрану. Після подвійного клацання миші вікно пересувається так, що його центр співпадає з координатами курсору миші в мить клацання.
Дочірнє вікно розміром 100х100 при переміщенні курсору миші над ним “тікає” від курсору миші в довільному напрямку, залишаючись в межах робочої області батьківського вікна.
При запуску другого екземпляру додатку повідомити про заборону запуску декількох екземплярів, на передній план пересунути перший екземпляр додатку, 3 рази змінити підсвічування його вікна, видаючи звукове попередження, і завершити роботу другого екземпляру.
В робочій області вікна додатку поруч один з одним розташовані 3 тимчасових вікна, кожне з яких по-своєму реагує на натискання лівої кнопки миші.
Вікно 1-го екземпляру додатку розташувати в лівому верхньому, 2-го – в правому верхньому, 3-го – в лівому нижньому, 4-го – в правому нижньому куті екрану. Причому всі вікна рівних розмірів і разом займають весь екран. В заголовку вікна вказати номер екземпляра. Заборонити запуск 5-го екземпляру.
При запуску додатку показати вікна вже існуючих копій цього додатку і запитати користувача, чи потрібно запускати ще один екземпляр. Якщо “Так”, то запустити його. Якщо “Ні”, завершити роботу додатку.
Центр робочої області вікна займає тимчасове вікно розміром в чверть площі області. Воно пересувається в той кут робочої області, де клацнули лівою кнопкою миші. А після клацання правою клавішею миші тимчасове вікно пересувається в кут, протилежний поточному куту.
Вікно додатку займає чверть екрану і розташоване в лівому верхньому куті. Створити тимчасове вікно такого ж розміру в правому нижньому куті екрану. Будь-яке вікно після натискання лівої кнопки миші пересувається у вільний за годинниковою стрілкою кут.
Вікно розміром в чверть площі екрану розташоване в центрі екрану. Після натискання лівої кнопки миші вікно декілька разів змінює підсвічування і пересувається в той кут екрану, де курсор миші виявляється за межами вікна.
Вікно додатку розміром в чверть площі екрану займає один з кутів екрану. Після натискання лівої кнокпи миші вікно згортається в піктограму. Після клацання по піктограмі воно відновлюється в іншому куті екрану.
В робочій області вікна додатку поруч одне з одним розташувати 4 тимчасових вікна, в заголовках яких вказано номер вікна. Після натискання лівої кнокпи миші тимчасове вікно видає повідомлення, що містить номер вікна.
В кутах робочої області вікна додатку створені невидимі тимчасові вікна із заголовком. Кожне вікно стає видимим після натискання лівої кнопки миші поза його частиною робочої області і стає невидими після натискання лівої кнопки миші над його робочою областю.
Вікно додатку розміром в чверть площі екрану займає один з кутів екрану. Після натискання лівої кнопки миші вікно згортається в піктограму. Після клацання по піктограмі воно відновлюється в іншому куті екрану.
При запуску не першого екземпляру додатку видати попереджаючий звуковий сигнал і повідомити про кількість вже працюючих копій цього додатку. Запустити екземпляр, тільки якщо згоден користувач.
Центр робочої області вікна займає тимчасове вікно розміром в чверть площі області в згорнутому стані. Після натискання лівої кнопки миші над робочою областю тимчасове вікно розгортається в центрі області, а після натискання правої – згортається в центрі.
Вікно додатку займає чверть екрану і розташоване в правому верхньому куті. Створити тимчасове вікно такого ж розміру в лівому нижньому куті екрану. Будь-яке вікно після натискання лівої кнопки миші пересувається у вільний проти годинникової стрілки кут.