Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование в Windows API. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
12.08.2026
Размер:
752 Кб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]