Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lab_progr_Win / Lab7

.doc
Скачиваний:
9
Добавлен:
23.03.2015
Размер:
1.09 Mб
Скачать

Лабораторна робота №7.

Тема роботи: Використання в програмі користувальницьких значків, курсорів, бітових образів.

Ціль роботи: Придбання досвіду створення прикладного програмного забезпечення для Windows з використанням у програмі користувальницьких значків, курсорів, бітових образів.

ТЕОРЕТИЧНА ЧАСТИНА

У більшість програм для Windows включаються користувальницькі значки, що Windows виводить на екран у лівому верхньому куті рядка заголовка вікна додатка. Крім цього Windows виводить на екран значок програми в списках програм меню Start, чи в панелі задач у нижній частині екрана, чи в списку програми Windows Explorer. Деякі програми — найбільш відомими з який є графічні програми для малювання, наприклад Windows Paint, використовують власні курсори миші для відображення різних дій програми. У дуже багатьох програмах для Windows використовуються вікна меню і діалогу. Разом зі смугами прокручування вікна меню і діалогу — це основа стандартного користувальницького інтерфейсу Windows.

Значки, курсори, вікна меню і діалогу зв'язані між собою. Усе це види ресурсів (resources) Windows. Ресурси є даними, і вони зберігаються в.EXE файлі програми, але розташовані вони не в області даних, де звичайно зберігаються дані програм, що виконуються. Таким чином, до ресурсів немає безпосереднього доступу через змінні, визначені у вихідному тексті програми. Вони повинні бути явно завантажені з файлу з розширенням .EXE у пам'ять.

Коли Windows завантажує в пам'ять код і дані програми для її виконання, вона звичайно залишає ресурси на диску. Тільки тоді, коли Windows потрібний конкретний ресурс, вона завантажує його в пам'ять. Дійсно, ви могли звернути увагу на таке динамічне завантаження ресурсів при роботі з Windows-програмами. Коли ви перший раз викликаєте вікно діалогу програми, Windows звичайно звертається до диска для копіювання ресурсу вікна діалогу з файлу з розширенням .EXE програми в оперативну пам'ять.

Програма-інструмент, що ви використовуєте для створення значків, курсорів і бітових образів часто називають редактором зображень (image editor), і він є однієї з найбільш важливих утиліт розроблювача в будь-якім інтегрованому середовищі розробки програм для Windows. Як значки, так і курсори є різновидом бітових образів, тому буде корисно розглянути бітові образи першими.

Бітовий образ (bitmap) — це бітовий масив, де один чи більш бітов відповідають кожному пикселю екрана. У монохромному бітовому образі для кожного пікселя потрібно один біт. (У найпростішому випадку 1 відповідає білому кольору, а 0 — чорному. Проте, бітові образи часто використовуються не тільки для створення простих малюнків, але й у логічних операціях.) У кольоровому бітовому образі для відображення кольору кожного пікселя відповідає декілька бітів. Редактори зображень звичайно підтримують створення монохромних і 16-кольорових бітових образів. У 16-кольоровому бітовому образі для кожного пікселя потрібно 4 біта.

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

Теоретично, Windows виводить значки і курсори на екран у піксельному розмірі. Це гарантує, що вони не будуть ні занадто великими, ні занадто маленькими. Однак, що підходять для гнітючої більшості відеоадаптерів VGA (Video Graphics Array), з дозволом екрана 640 пікселей по горизонталі і 480 по вертикалі, розміри значків і курсорів змінюються не зовсім так, як потрібно.

У Windows 95 мається два розміри значків — стандартний і маленький. На дисплеях VGA стандартний значок має розмір 32 пікселя в ширину і 32 пікселя у висоту, а площа маленького значка дорівнює 16 квадратних пікселей. Маленький значок використовується в лівій частині рядка заголовка додатка для виклику системного меню, у панелі задач системи в нижній частині екрана, а також у списках програм меню Start. Значки, що з'являються на робочому столі, мають стандартний розмір. У програмі Windows Explorer і меню Start користувач може довільно вибирати стандартний чи маленький значок.

У програмі можна одержати горизонтальний (X) і вертикальний (Y) розміри значків і курсорів, використовуючи функцію GetSystemMetrics з параметрами SM_CXICON і SM_CYICON (для стандартного значка), SM_CXSMICON і SM_CYSMICON (для маленького значка) і SM_CXCURSOR і SM_CYCURSOR для курсорів миші. Для більшості дисплеїв розміри стандартних курсорів і значків однакові.

У файлі опису ресурсів посилання на файл значка виглядає приблизно так:

myicon ICON iconfile.ico

де ICONFILE.ICO — ім'я файлу значка. У цій інструкції значку привласнюється ім'я "myicon". У програмі на Сі для одержання дескриптора значка використовується функція LoadIcon. У функції LoadIcon мається два параметри. Першим є дескриптор екземпляра вашої програми, що у WinMain звичайно називається hInstance. Цей дескриптор потрібно для Windows, щоб визначити, у якому файлі з розширенням .EXE міститься ресурс значка. Другим параметром є ім'я значка з опису ресурсів, задане у виді покажчика на рядок, що закінчується нулем. Значенням функції LoadIcon, що повертається, є значення типу HICON, що визначається в WINDOWS.H.

Мається зв'язок між ім'ям значка в описі ресурсів і в інструкції, що містить функцію LoadIcon вашої програми на Сі:

Опис ресурсів:

myicon ICON iconfile.ico

Вихідний текст програми:

hIcon = LoadIcon (hInstance, "myicon");

Не турбуйтеся про те, у верхньому чи нижньому регістрі задане ім'я значка. Компілятор перетворює у файлі опису ресурсів ім'я значка в символи верхнього регістра і вставляє це ім'я в таблицю ресурсів у заголовку файлу програми з розширенням .EXE. При першому виклику функції LoadIcon, Windows перетворить рядок, заданий другим параметром у символи верхнього регістра і відшукує в таблиці ресурсів файлу з розширенням .EXE співпадаюче з цим рядком ім'я.

Замість імені ви також можете використовувати число (16-розрядне беззнакове WORD). Це число називається ідентифікатором (ID) значка. Нижче показано як це робиться:

Опис ресурсів:

125 ICON iconfile.ico

Вихідний текст програми:

hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (125));

MAKEINTRESOURCE (make an integer into a resourse string — перетворити ціле в рядок ресурсу) є макросом, визначеним у заголовних файлах Windows, що перетворить число в покажчик, але зі старшими 16 розрядами, встановленими в нуль. Так Windows довідається, що другий параметр функції LoadIcon є числом, а не покажчиком на символьний рядок.

Інструкції для завдання курсору у файлі опису ресурсів і для одержання дескриптора курсору у вашій програмі дуже схожі на показані раніше інструкції для значків:

Опис ресурсів:

mycursor CURSOR cursfile.cur

Вихідний текст програми:

hCursor = LoadCursor (hInstance, "mycursor");

Інші способи, показані для значків (використання ідентифікаторів і MAKEINTRESOURCE), також працюють і для курсорів. У заголовні файли Windows включається визначення typedef HCURSOR, що ви можете використовувати для збереження дескриптора курсору.

Ви можете використовувати дескриптор курсору, отриманий при виклику функції LoadCursor, при завданні поля hCursor структури класу вікна:

wndclass.hCursor = LoadCursor (hInstance, "mycursor");

Це змушує курсор миші, якщо він виявляється в робочій області вашого вікна, перетворюватися у ваш користувальницький курсор.

Бітовий образ включається у файл опису ресурсів у тім же форматі, що чи значок курсор:

resourc2 BITMAP resourc2.bmp

Головна відмінність між бітовими образами й іншими ресурсами в їхній практичній важливості і може бути легко виражене так: бітові образи є об'єктами GDI. Гарний стиль складання програм рекомендує, що бітові образи повинні бути вилучені з програми, якщо в них відпадає нестаток, чи якщо програма завершується.

Для приклада створимо додаток, що використовує свої власні ресурси: значок і курсор, а також заповнює робочу область вікна додатка бітовим образом.

Зовнішній вигляд програми буде наступним:

Рисунок 2.9 Зовнішній вигляд програми ZNCURBIT.

Створення додатка, що використовує значки, курсори і бітові образи.

  1. Створіть новий проект ZNCURBIT (ZNachok&&CURsor&&BITmap).

  2. Тепер приступимо до створення ресурсів, використовуваних у нашій програмі zncurbit.cpp. Для чого зробіть наступне: Project | Add To Project | New. На закладці Files вибираємо в списку Resource Script, задаємо назву файлу ресурсів — zncurbit і натискаємо ОК. Перейдіть у вікно Workspace, на вкладку ResourceView правою кнопкою миші кликніть на zncurbit resources і виберіть пункт Insert.

Рисунок 2.10 Додавання нового ресурсу до Resource Script.

У вікні, що з'явилося, Insert Resource, виберіть потрібний пункт і натисніть кнопку New.

Рисунок 2.11 Додавання нового ресурсу до Resource Script.

  1. Щоб додати значок виберіть у вікні Insert Resource пункт Icon і натисніть кнопку New. Намалювавши значок, збережіть його і задайте йому ідентифікатор «MY» (обов'язково в лапках, тому що це покажчик на рядок, а не число). Для чого у вікні Workspace, на вкладці ResourceView правою кнопкою миші кликніть на імені значка і виберіть Properties.

Рисунок 2.12 Завдання ID значка.

  1. Подібним же чином створіть курсор і бітовий образ, вибираючи відповідно у вікні Insert Resource Cursor і Bitmap. В обох випадках задавайте ідентифікатор «MY».

  2. Тепер, коли підготовка окінчена, можна переходити до написання програми. Для початку створіть файл zncurbit.cpp і скопіюйте в нього вміст файлу sample.cpp, що був створений у Лабораторній роботі №1.

  3. Крім заголовного файлу windows.h підключаємо тільки що створений редактором ресурсів заголовний файл resource.h:

#include <windows.h>

#include "resource.h"

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

  1. Функцію WinMain варто піддати для початку наступним незначним змінам:

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

static char szAppName[] = "my" ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

HWND hWnd;

MSG msg ;

WNDCLASS wndclass ;

RegisterClass (&wndclass) ;

hWnd = CreateWindow (szAppName, "Icon and Cursor Demo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL,hInstance, NULL) ;

  1. Щоб підключити створений вами значок, необхідно додати до програми наступний код:

wndclass.cbClsExtra = 0 ;

wndclass.cbWndExtra = 0 ;

wndclass.hInstance = hInstance ;

wndclass.hIcon = LoadIcon (hInstance, szAppName) ;

Оскільки символьний рядок "my" зберігається в масиві szAppName і уже використовується програмою як ім'я класу вікна, функція LoadIcon викликається просто:

LoadIcon (hInstance, szAppName);

  1. Курсор включається в програму також просто:

wndclass.cbClsExtra = 0 ;

wndclass.cbWndExtra = 0 ;

wndclass.hInstance = hInstance ;

wndclass.hIcon = LoadIcon (hInstance, szAppName) ;

wndclass.hCursor = LoadCursor (hInstance, szAppName) ;

  1. А от щоб заповнити бітовим образом робочу область вікна, необхідно додати наступний код:

#include <windows.h>

#include "resource.h"

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

char szAppName[] = "my" ;

HBITMAP hBitmap ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

HBRUSH hBrush ;

HWND hwnd ;

MSG msg ;

WNDCLASS wndclass ;

hBitmap = LoadBitmap (hInstance, szAppName) ;

hBrush = CreatePatternBrush (hBitmap) ;

wndclass.hCursor = LoadCursor (hInstance, szAppName) ;

wndclass.hbrBackground = hBrush ;

wndclass.lpszMenuName = NULL ;

while (GetMessage (&msg, NULL, 0, 0))

{

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

}

DeleteObject ((HGDIOBJ) hBrush) ;

DeleteObject ((HGDIOBJ) hBitmap) ;

Використовувана в WinMain функція LoadBitmap аналогічна функціям LoadIcon і LoadCursor. Її значенням, що повертається, є дескриптор бітового образа:

hBitmap = LoadBitmap (hInstance, szAppName);

Цей дескриптор потім використовується для створення шаблонової кисті (pattern brush). Основою кисті є бітовий образ:

hBrush = CreatePatternBrush (hBitmap);

Коли Windows зафарбовує цією кистю область екрана, бітовий образ повторюється по горизонталі і вертикалі через кожні вісьмох пікселей. Ця кисть нам потрібна для додання фону робочої області того кольору, що ми підібрали при визначенні класу вікна:

wndclass.hbrBackground = hBrush;

  1. Приведений вище код для заповнення бітовим образом робочої області вікна програми працює тільки для бітових образів розміром 8х8 пікселів. Якщо ж вам необхідно заповнити робочу область вікна програми великим бітовим образом, то внесіть у програму наступний код:

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

BITMAP bm ;

static int cxClient, cyClient ;

HDC hdc;

PAINTSTRUCT ps ;

switch (iMsg)

{

case WM_SIZE :

cxClient = LOWORD (lParam) ;

cyClient = HIWORD (lParam) ;

return 0 ;

case WM_PAINT :

hdc = BeginPaint (hwnd, &ps) ;

hmdc=CreateCompatibleDC(hdc);

SelectObject(hmdc,hBitmap);

GetObject(hBitmap, sizeof(bm), (LPSTR) &bm);

for (y = 0 ; y < cyClient ; y += bm.bmHeight)

for (x = 0 ; x < cxClient ; x += bm.bmWidth)

BitBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, hmdc, 0, 0, SRCCOPY);

DeleteDC(hmdc);

ValidateRect(hwnd,NULL);

EndPaint (hwnd, &ps) ;

return 0 ;

Цей код створює ще один контекст пристрою, сумісний з контекстом пристрою вікна. Це робиться за допомогою функції CreateCompatibleDC. Перш ніж растрове зображення зможе бути виведене на екран, воно спочатку повинно бути обране в цей другий контекст пристрою.

Функція SelectObject вибирає об'єкт у даний контекст пристрою. Вона завжди повертає об'єкт, що перед цим був у контексті пристрою (для наступного відновлення). Після того, як растрове зображення показане і відновлене попереднє растрове зображення, потрібно видалити другий контекст пристрою за допомогою DeleteDC.

ПРАКТИЧНА ЧАСТИНА

  1. Створіть програму ZNCURBIT, описану в лабораторній роботі.

2. Створіть програму, у якій використовуйте свої власні значок, курсор і заповните робочу область своїм власним бітовим образом.

Контрольні питання:

  1. Що таке файл ресурсів? Якими способами його можна створювати?

  2. На якому етапі створення додатка ресурси записуються в завантажувальний модуль додатка?

  3. Які дані додаток може зберігати у виді ресурсів?

  4. Як у ресурси додатка включити зображення піктограми?

  5. Які існують способи завантаження і використання піктограми, що міститься в ресурсах додатка?

  6. Який оператор використовується для включення в ресурси додатка зображення курсору миші?

  7. Які існують способи завантаження і використання зображення курсору миші, що міститься в ресурсах додатка?

  8. Як уключити зображення типу bitmap у ресурси додатка?

  9. Як завантажити і використовувати зображення типу bitmap?

Соседние файлы в папке Lab_progr_Win