Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
API_LAB.doc
Скачиваний:
1
Добавлен:
06.05.2019
Размер:
485.38 Кб
Скачать

Практична робота №2

Тема: Створення головного вікна. Вивчення функцій роботи з зображенням.

Мета: Навчитись створювати картинки користувача.засобами API.

Теоретичні відомості:

Початковим є проект, отриманий після виконання лабораторної роботи № 2.

У вікні можна вмістити будь-яку картинку. Наприклад, свою фотокартку. Скопіюйте файл типу *.BMP в папку з вашим проектом. Додайте цей файл в проект через команди меню Project->Add To Project->New або натисніть Ctrl+R. В стандартному вікні вибору ресурсів вибрати Bitmap. Компілятор вважає, що bitmap - це маленька картинка типу іконки розміром 16Х16. Якщо вибрати Import, то можна вказати файл картинки у вікні "Открыть..". За замовчуванням, йому присвоїться ім’я IDB_MYIMAGE. Його можна змінити.

Файл ресурсів може бути таким:

//pr2.rc

#include "windows.h"

IDI_MYICON ICON "lr2.ico"

IDC_MYCURSOR CURSOR "lr2.cur"

IDB_MYIMAGE BITMAP "pr2.bmp"

В проекті для виведення на екран картинки виконати такі кроки:

Крок 1.Оголошення імені картинки:

Змінна s szImageName [] буде мати в собі рядок з іменем ресурсу IDB_MYIMAGE:

char szProgName[]="Імя програми"; //ім’я програми

char szIconName[]="IDI_MYICON"; //імя іконки

char szCursorName[]="IDC_MYCURSOR" //імя курсору

char szImageName[]="IDB_MYIMAGE "; //імя картинки

Тип даних HBITMAP подібний до типів HCURSOR і HICON тим, що змінні цього типу призначені для зв’язку програми з певним ресурсом, в даному випадку, зображенням:

HBITMAP hBitmap;

Крок 2. Зв’язати ідентификатор картинки з ресурсом за допомогою функції LoadBitmap

Крок 3.Оголошення контексту зображення

Для виведення на екран картинки, їй виділяється свій контекст hmdc, що відрізняється від HDC, але має бути сумісний з ним. Для цього на 5-му кроці застосовується функція CreateCompatibleDC(HDC), значення якої дорівнює контексту зображення. Тепер, виведення картинки в hmdc, ідентичне виведенню її в HDC:

LRESULT CALLBACK WndProc(...)

{

HDC hdc, hmdc; //оголошення ще одного контексту зображення hmdc

PAINTSTRUCT ps;

Крок 4. Оголосити екземпляр структури BITMAP

Всі дані про зображення: розмір, кількість планів, висоту, ширину, кількість біт, виділених для опису пікселя, має в собі структура BITMAP. Ця структура далі має бути заповнена інформацією про картинку з ресурсу pr2.bmp. Після виконання на п’ятому кроці функції GetObject(…), cтруктура BITMAP буде заповнена усім, що зв’язано з hBitmap. Другим аргументом функції GetObject, вказується розмір структури, за допомогою функції sizeof(bm).

BITMAP bm;

Крок 5. Виведення на екран

Тут створюється сумісний контекст функцією CreateCompatibleDC(), об’єкт hBitmap стає активним в контексті hmdc, заповнюємо структуру BITMAP за допомогою GetObject(), виводимо на екран картинку за допомогою функції BitBlt().

Лістинг програми:

//pr2.cpp

#include<windows.h>

#include<tchar.h>

const wchar_t szTitle[]=_T("ЗПЗС-114 Пр№2 Вариницький С.В.");

//const wchar_t szText[]=_T("Міняємо іконку і курсор!");

const wchar_t szProgName[]=_T("Пр№2");

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[], BOOLEAN const tmp=FALSE) {

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, (tmp)? NOTSRCCOPY:SRCCOPY); //Виведення картинки на екран в точку 10, 10 з пам’ятi (hmdc)

DeleteDC(hmdc); //видалення контексту з пам’яті

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam)

{

HDC hdc; PAINTSTRUCT ps;

switch(messg)

{

case WM_PAINT :

hdc=BeginPaint(hWnd, &ps);

outPicture(hdc, 0, 10, _T("IDB_MYIMAGE"),TRUE);

TextOut(hdc, 290,10, _T("Виберіть будь-яку карту"), 21);

outPicture(hdc, 50, 40, _T("IDB_2B"));

outPicture(hdc, 250, 40, _T("IDB_5T"));

outPicture(hdc, 450, 40, _T("IDB_10P"));

ValidateRect(hWnd, NULL);

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, messg, wParam, lParam);

}

return 0;

}

Вікна результатів:

Висновки: Я Навчився створювати картинки користувача засобами API