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