Практична робота №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