Программирование в Windows API. Учебное пособие
.pdf
5.6 Пример программы вывода простых графических примитивов
#include <windows.h> #include <tchar.h>
HINSTANCE hi_app; HWND hwnd_main;
LPCTSTR pc_WindowClassName = _T("WindowClassName"); LPCTSTR pc_wndTitle =_T("Пример GDI-графики");
BOOL RegisterWndClasses (void); void UnregisterWndClasses (void); BOOL CreateWindows (void);
LRESULT CALLBACK MainWindowProc (HWND, UINT, WPARAM, LPARAM);
BOOL MainOnDestroy (HWND); BOOL MainOnPaint (HWND); BOOL InitializeApp (void); void UninitializeApp (void);
int APIENTRY WinMain (HINSTANCE, HINSTANCE, LPSTR, int);
61
BOOL RegisterWndClasses ()
{
WNDCLASSEX wce_main; |
|
|
memset (&wce_main, |
0, sizeof(WNDCLASSEX)); |
|
wce_main.cbSize |
= |
sizeof(WNDCLASSEX); |
wce_main.hInstance |
= |
hi_app; |
wce_main.style |
= |
CS_VREDRAW | CS_HREDRAW; |
wce_main.lpfnWndProc |
= (WNDPROC)MainWindowProc; |
|
wce_main.hCursor = |
LoadCursor(NULL, IDC_ARROW); |
|
wce_main.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);
wce_main.lpszClassName = pc_WindowClassName;
return RegisterClassEx (&wce_main);
}
BOOL CreateWindows ()
{
int scrw2 = GetSystemMetrics(SM_CXSCREEN) / 2, scrh2 = GetSystemMetrics(SM_CYSCREEN) / 2;
hwnd_main = CreateWindow(pc_WindowClassName, pc_wndTitle, WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_THICKFRAME | WS_CLIPCHILDREN | WS_MINIMIZE | WS_VISIBLE,
scrw2-400, scrh2-300, 800, 600, NULL, NULL, hi_app, 0);
if (! hwnd_main) return FALSE;
return TRUE;
}
62
LRESULT CALLBACK MainWindowProc
(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
case WM_PAINT: return MainOnPaint (hwnd);
case WM_DESTROY: return |
MainOnDestroy |
(hwnd); |
|
default: |
return |
DefWindowProc |
|
(hwnd, msg, wParam, lParam);
}
return 0L;
}
BOOL MainOnPaint (HWND hwnd)
{
PAINTSTRUCT ps; int a=150;
HPEN hpen_1 = CreatePen(PS_SOLID, 3,
RGB(255, 0, 255)), hpen_2 = CreatePen(PS_DASH, 1 ,
RGB(0, 255, 0)),
hpen_prv;
HBRUSH hbrush_1 = // желтый CreateHatchBrush(HS_BDIAGONAL,RGB(255, 255, 0)),
hbrush_prv;
HDC hdc = BeginPaint(hwnd, &ps); SetBkMode (hdc, TRANSPARENT);
hpen_prv =(HPEN)SelectObject(hdc, hpen_2); hbrush_prv =(HBRUSH)SelectObject(hdc,hbrush_1);
MoveToEx (hdc, 50,200, NULL);
LineTo (hdc, 400, 200);
SelectObject (hdc, hpen_1);
Ellipse (hdc, 450, 150, 600, 250);
SetTextColor (hdc, RGB(0, 255, 0));
TextOut (hdc, 100,150, _T("SetBkMode (hdc,
TRANSPARENT)"),
lstrlenA("SetBkMode (hdc, TRANSPARENT)"));
63
SetBkMode (hdc, OPAQUE);
SetBkColor (hdc,RGB(255, 0 , 0));
SelectObject(hdc, hpen_2);
MoveToEx (hdc, 50,200+a, NULL);
LineTo (hdc, 400, 200+a);
SelectObject (hdc, hpen_1);
Ellipse (hdc, 450, 150+a, 600, 250+a);
TextOut (hdc, 100,150+a-20,_T("SetBkMode (hdc, OPAQUE)"),
lstrlenA("SetBkMode (hdc, OPAQUE)"));
TextOut (hdc, 100,150+a, _T("SetBkColor (hdc,RGB(255, 0 , 0));"), lstrlenA("SetBkColor(hdc,RGB(255,0,0));"));
SelectObject (hdc, hpen_prv);
SelectObject (hdc, hbrush_prv);
EndPaint (hwnd, &ps);
DeleteObject (hpen_1);
DeleteObject (hpen_2);
DeleteObject (hbrush_1);
return TRUE;
}
64
5.7 Пример обработчика сообщения WM_PAINT
Пример иллюстрирует правила выполнения графического вывода в окно с помощью обработки сообщения WM_PAINT. Функция MainOnPaint рисует 3 отрезка разными перьями, затем выводит текст START и FINISH, рисует 3 разных эллипса и квадрат. Создание и удаление объектов GDI выполняется каждый раз при обработке сообщения WM_PAINT. Такой подход не является рациональным по производительности, но позволяет наглядно показать использование в программе нескольких объектов GDI.
65
LRESULT CALLBACK MainWindowProc (HWND hwnd,
UINT msg, WPARAM wParam, LPARAM lParam)
{switch (msg) {
case WM_PAINT: return MainOnPaint (hwnd); case WM_DESTROY: return MainOnDestroy (hwnd); default: return DefWindowProc (hwnd, msg,
wParam, lParam);
}
return 0L;
}
BOOL MainOnPaint (HWND hwnd)
{
PAINTSTRUCT ps;
HPEN hpen_1 = CreatePen(PS_SOLID,3,RGB(255,0,0)), hpen_2 = CreatePen(PS_DASH, 1,RGB(0,255,0)), hpen_prv;
// желтый
HBRUSH hbrush_1= CreateSolidBrush(RGB(255,255, 0)), hbrush_2= CreateSolidBrush(RGB(255,0,255)),
// фиолетовый
hbrush_3= CreateHatchBrush(HS_DIAGCROSS,RGB(255,0,255)),
// фиолетовый
hbrush_prv;
HDC hdc = BeginPaint(hwnd, &ps);
SetBkMode (hdc, TRANSPARENT);
hpen_prv = (HPEN)SelectObject(hdc, hpen_2); hbrush_prv = (HBRUSH)SelectObject(hdc, hbrush_1);
MoveToEx (hdc, 0, 0, NULL);
LineTo (hdc, 200, 200);
SelectObject (hdc, hpen_1);
LineTo (hdc, 400, 400);
LineTo (hdc, 300, 450);
66
// Вывод текста
SetTextColor (hdc, RGB(255, 0, 0));
TextOut (hdc, 300,480, _T("START"),
lstrlenA("START"));
SetTextColor (hdc, RGB(255, 255, 0));
TextOut (hdc, 380,480, _T("FINISH"),
lstrlenA("FINISH"));
// эллипс с заливкой и контуром
Ellipse (hdc, 400, 400, 500, 460);
//эллипс с контуром
SelectObject (hdc, (HBRUSH)GetStockObject(HOLLOW_BRUSH));
Ellipse (hdc, 400, 400-150, 500, 460-150);
//эллипс с заливкой и штриховкой
//без контурной рамки
SelectObject (hdc, (HPEN)GetStockObject(NULL_PEN));
SetBkMode (hdc, OPAQUE);
SetBkColor (hdc,RGB(255, 255, 0));
SelectObject (hdc, hbrush_3);
Ellipse (hdc, 400, 400-300, 500, 460-300);
SetBkMode (hdc, TRANSPARENT);
// многоугольник |
|
|
int dCoor = 100; |
|
|
POINT apnt_coords[] = { |
|
|
{ 200, |
100 |
}, |
{ 200+dCoor, |
100 |
}, |
{ 200+dCoor, |
100+dCoor |
}, |
{ 200, |
100+dCoor |
} |
};
SelectObject(hdc, hbrush_2); SelectObject(hdc, hpen_2); Polygon (hdc, apnt_coords, 4);
67
SelectObject (hdc, hpen_prv); SelectObject (hdc, hbrush_prv);
EndPaint (hwnd, &ps);
DeleteObject (hpen_1);
DeleteObject (hpen_2);
DeleteObject (hbrush_1);
DeleteObject (hbrush_2);
return TRUE;
}
68
Литература
1.Фролов Л.В., Фролов Г. В. Операционная система WINDOWS 95 для программиста. (Библиотека системного программиста; т. 22) – М.: Диалог-
МИФИ, 1996. – 288 с.
2.Щупак Ю. А. Win32 API. Эффективная разработка приложений. – СПб.: Питер, 2007. – 572 с.
3.Щупак Ю. А. Win32 API. Разработка приложений для Windows. – СПб.: Питер, 2008. – 592 с.
4.Верма Р.Д. Справочник по функциям Win32 API. – М.: Горячая Линия Телеком, 2005. – 551с.
69
Св.план 2017 г., поз.41
Нестеров Иван Владимирович Резникова Эмма Романовна Щербаков Алексей Анатольевич
Программирование в Windows API
Учебное пособие
_____________________________________________________
Тираж 40 экз.
Москва, Копировальный центр PrintSide
70
