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

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

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

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

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

API надає великі можливості малювання - різнокольорові геометричні фігури, які можна заливати будь-яким кольором, еліпси, кола, прямокутники, лінії. Можна застосовувати пензлі та пера. Ці засоби API надають можпивість заливати фігури не лише суцільно, і застосовувати пунктирні і штрих-пунктирні лінії.

За основу взяти програму практичної роботи №2. Розглядається повідомлення WM_PAINT.

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

SetPixel(hDC, 10,10, RGB(0,0,0));

Функція GetPixel відповідно повертає колір точки з заданими координатами.

2. Малювання ліній.

LineTo(hDC, int x, int y);

Функція LineTo малює лінію від поточної позиції до місця, вказаного в аргументах.

Можна скористатися функцією для задання поточних координат

MoveToEx(hdc, x1, y1, NULL); //зробити поточними координати x1, y1

LineTo(hdc, x2, y2);// провести лінію до точки x2, y2

3. Дуга

Arc(hDC, int left, int top, int right, int bottom, int x1, int y1, int x2, int y2);

2-5 аргументи - лівий верхній та правий нижній кути прямокутника, в який вписаний еліпс. Решта - координати точок, від котояких будуть проведені прямі до центру еліпсу. В місцях перетину первшої і другої прямих з радіусом еліпса, починається і кінчається дуга.

4. Прямокутник. За замовчуванням – прозорий.

Rectangle(hDC, int left, int top, int right, int bottom); //аргументи - координати лівого верхнього і правого нижнього кутів

5. Заокруглений прямокутник. Іноді використовується, як імпровізована кнопка.

RoundRect(hDC, int left, int top, int right, int bottom, int width, int height);

Перші пять параметрів співпадають з параметрами попередньої фукнції. Аргументи width і height задають ширину і висоту еліпса, дуги якого обмежують прямокутник.

6. Пензлі. Пензель зафарбовує певну область заданий колір. Можна задати свій стиль пензля.

Способи задання пензля: первший - задати суцільну заливку, другий – вказати стиль. Для цього відповідно використовуються функції: CreateSoldBrush() і CreateHatchBrush().

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

//pr3.cpp

#include<windows.h>

#include<tchar.h>

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

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

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, 610, 150, (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;

RECT r;HBRUSH hBrush;HPEN hPen;

LOGFONT lf;HFONT hFont;

switch(messg)

{

case WM_PAINT :

hdc=BeginPaint(hWnd, &ps);

SetBkMode(hdc, TRANSPARENT);

lf.lfCharSet=DEFAULT_CHARSET;

lf.lfPitchAndFamily=DEFAULT_PITCH;

lstrcpyW(lf.lfFaceName, _T("Arial"));

lf.lfHeight=12;

lf.lfWidth=7;

lf.lfItalic=0;

lf.lfUnderline=0;

lf.lfStrikeOut=0;

lf.lfEscapement=900;

hFont = CreateFontIndirect(&lf);

SelectObject(hdc, hFont);

//Червоне коло з чорною лінією периметру

TextOut(hdc, 0, 73, _T("Коло"), strlen("Коло"));

hPen=CreatePen(PS_INSIDEFRAME , 3, RGB(0,0,0)); //создаём всё три

SelectObject(hdc, hPen);

hBrush=CreateSolidBrush(RGB(255,0,55));

SelectObject(hdc, hBrush);

Ellipse(hdc, 10, 5, 110, 105);

//Жовттий еліпс з червоною лінією периметру

TextOut(hdc, 115, 73, _T("Еліпс"), strlen("Еліпс"));

hPen=CreatePen(PS_INSIDEFRAME , 3, RGB(255,0,55)); //создаём всё три

SelectObject(hdc, hPen);

hBrush=CreateSolidBrush(RGB(255, 255, 0));

SelectObject(hdc, hBrush);

Ellipse(hdc, 125,25,250,90);

//Зафарбований фіолетовий прямокутник

TextOut(hdc, 253, 105, _T("Прямокутник"), strlen("Прямокутник"));

r.top=5;

r.left=265;

r.right=400;

r.bottom=105;

FillRect(hdc, &r, HBRUSH(CreateSolidBrush(RGB(128, 0, 255))));

//Синій прямокутник в діагональну зелену лінію з померанчевою рамкою

TextOut(hdc, 408, 105, _T("Пр. з рамкою"), strlen("Пр. з рамкою"));

hBrush=CreateSolidBrush(RGB(0, 0, 255));

SelectObject(hdc, hBrush);

Rectangle(hdc, 420, 5, 600, 105);

SetBkMode(hdc, TRANSPARENT);

hBrush = CreateHatchBrush(HS_FDIAGONAL , RGB(0, 128, 0));

SelectObject(hdc, hBrush);

hPen=CreatePen(PS_INSIDEFRAME , 3, RGB(255, 128, 0));

SelectObject(hdc, hPen);

Rectangle(hdc, 420, 5, 600, 105);

ValidateRect(hWnd, NULL);

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

PostQuitMessage(0);

DeleteObject(hPen);

DeleteObject(hBrush);

break;

default:

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

}

return 0;

}

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

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