Приклади виведення в клієнтську область вікна графіки і тексту

Нехай у додатку необхідно виводити в клієнтську область вікна текст, графічні примітиви і растрове зображення Для того щоб можна було виконувати цей висновок незалежно і в потрібній послідовності, будемо при натисканні клавіші «1» виводити рядки тексту, при натисканні клавіші «2» виводити графічні фігури, а при натисненні «3» растрове зображення Тоді вибір при виведенні будемо запамятовувати у змінній w при обробці повідомлення про відпуску клавіші WMKEYUP, а власне висновок будемо реалізовувати-вать у функціях Font_Draw, Graf_Draw і Paint_Proc:

.elseif uMsg == WM_KEYUP if wParam=VK_l

mov w,1 elseif wParam=VK_2

mov w,2 elseif wParam=VK_3

mov w,3 endif

invoke InvalidateRect,hWin,NULL,TRUE elseif uMsg == WM_PAINT

invoke BeginPaint,hWin,ADDR Ps mov hDC, eax if w==l

invoke Font_Draw,Pshdc elseif w==2

invoke Graf_Draw,Pshdc elseif w==3

invoke Pa±nt_Proc,hWin,hDC endif invoke EndPaint,hWin,ADDR Ps return 0

Демонстраційна функція для виведення тексту:

Font_Draw proc hDC :HDC LOCAL hObj :DWORD LOCAL hOldObj :DWORD s z Text s z S tring, &quot *As sembler* &quot szText FontO,&quotTimes New Roman&quot s z Text Fontl,&quotCentury Go thic&quot szText Font2,&quotMonotype Corsiva&quot RGB 34,57,94 invoke SetBkColor,hDC,eax

; Виведемо текст OEM-шрифтом, дескриптор вже існує invoke GetStockObject, OEM_FIXED_FONT mov hObj, eax

invoke SelectObject,hDC,hobj mov h01dObj,eax

invoke TextOut,hDC,20,20,offset szString,ll invoke SelectObject,hDC,h01dObj invoke DeleteObject,hobj

; Виведемо текст системним шрифтом

invoke GetStockObject,SYSTEM_FONT

mov hObj,eax

invoke SelectObject,hDC,hObj

mov h01dObj,eax

invoke TextOut,hDC,450,450,offset szString,ll

invoke SelectObject,hDC,h01dObj

invoke DeleteObject,hObj

; Заповнюємо структуру типу LOGFONT mov FontIfHeight, 40 mov FontlfWidth, 15 mov FontlfEscapement, 150 нахил mov FontIfOrientation, 50 нахил букв mov FontlfWeight, 1000 товщина mov FontIfItalic, FALSE mov FontlfUnderline,TRUE mov FontIfS trikeOut,FALSE

mov FontlfCharSet, ANSI_CHARSET накреслення mov FontlfOutPrecision, OUT_OUTLINE_PRECIS mov FontIfClipPrecision, CLIP_DEFAULT_PRECIS

mov FontlfQuality,DRAFT_QUALITY

mov Font IfPitchAndFamily, 0

invoke lstrcpy, addr FontIfFaceName, addr FontO копіюємо імя гарнітури шрифту з FontO

invoke CreateFontIndirect,addr Font

mov hObj,eax

invoke SelectObject,hDC,hObj

invoke SetTextColor,hDC,155

invoke TextOut,hDC,250,100,offset szString,ll

invoke DeleteObject, hObj змінимо параметри шрифту і колір тексту при виведенні

INVOKE lstrcpy, addr FontIfFaceName, addr Fontl

mov FontIfHeight,20

mov FontlfWidth,30

mov FontlfEscapement,0

mov FontlfUnderline,FALSE

mov FontIfS trikeOut,TRUE

invoke CreateFontIndirect,addr Font

mov hObj,eax

invoke SelectObject,hDC,hObj

invoke SetTextColor,hDC,249

invoke TextOut,hDC,50,350,offset szString,ll

invoke DeleteObject, hObj ще раз змінимо параметри шрифту і колір тексту

invoke lstrcpy, addr FontIfFaceName, addr Font2

mov FontIfHeight,20

mov FontlfWidth,15

mov FontlfUnderline,FALSE

mov FontlfWeight,100

mov FontIfS trikeOut,FALSE

mov FontIfItalic,TRUE invoke CreateFontIndirect,addr Font

mov hObj,eax

invoke  SelectObject,hDC,hObj

invoke  SetTextColor,hDC,50

invoke  TextOut,hDC,60,160,offset  szString,ll

invoke DeleteObject,hObj

ret Font_Draw endp

Демонстраційна функція для виведення графічних примітивів:

Graf_Draw proc hDC:HDC LOCAL hObj:DWORD

LOCAL Xb:LOGBRUSH LOCAL pi:POINT LOCAL p2:POINT LOCAL p3:POINT LOCAL p4:POINT

invoke MoveToEx,hDC,5 0,10,NULL invoke LineTo,hDC,300,10

invoke CreatePen,PS_SOLID or PS_DOT,l,25

invoke SelectObject,hDC,eax

mov hObj,eax

invoke MoveToEx,hDC,5 0,3 0,NULL

invoke LineTo  ,hDC,300,30

invoke SelectObject,hDC,hObj

invoke DeleteObj ect,eax

mov lblbS tyle,BS_HATCHED

mov lblbColor,9452311

mov XblbHatch,HS_BDIAGONAL

invoke CreateBrushlndirect,addr 1±&gt

invoke SelectObject,hDC,eax

invoke Rectangle,hDC,300,300,500,500

invoke Arc,hDC,200,200,300,90,310,90,310,590

invoke DeleteObj ect,eax

mov pix,250

mov piy,300

mov p2x,550

mov p2y,300

mov p3x,400

mov p3y,200

mov lblbS tyle,BS_HATCHED

mov XblbColor,14950000

mov XblbHatch,HS_DIAGCROSS

invoke CreateBrushlndirect,addr 1±&gt

invoke SelectObject,hDC,eax

invoke Polygon,hDC,addr p3,3

invoke DeleteObj ect,eax

mov XblbStyle,BS_SOLID

mov XblbColor,00FF0000h

mov 1±) lbHatch, 0

invoke CreateBrushlndirect,addr 1±&gt

invoke SelectObject,hDC,eax

invoke Ellipse,hDC,375,230,425 ,280

invoke DeleteObj ect,eax

invoke CreatePen,PS_SOLID,8,255000 invoke  SelectObject,hDC,eax mov hObj,eax

mov li&gt. lbS tyle, BS_HATCHED mov XblbColor,000000FFh mov 1±&gt. lbHatch, 0

invoke CreateBrushlndirect,addr 1±&gt invoke  SelectObject,hDC,eax

invoke Pie,hDC,10,120,110,220,350,120,90,120 invoke Pie,hDC,10,120,110,220,90,430,90,200 invoke Pie,hDC,10,120,110,220,-800,0,-800,800 invoke DeleteObj ect,eax invoke  SelectObject,hDC,hObj invoke DeleteObj ect,eax ret Graf_Draw endp

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

Нехай є 4 кадри imglbmp, img2bmp img3bmp, img4bmp з мультфільму, наведені на малюнку 22 Ці растрові зображення опишемо в файлі ресурсів таким чином:

100  BITMAP MOVEABLE                                 PURE LOADONCALL DISCARDABLE &quotimglbmp&quot

200  BITMAP MOVEABLE                                 PURE LOADONCALL DISCARDABLE &quotimg2bmp&quot

300  BITMAP MOVEABLE                                 PURE LOADONCALL DISCARDABLE &quotimg3bmp&quot

400  BITMAP MOVEABLE                                 PURE LOADONCALL DISCARDABLE &quotimg4bmp&quot

Ідентифікатори растрових зображень при такому описі-це числа 100, 200, 300, 400

Для того щоб реалізувати висновок мультфільму в клієнтську область вікна, необхідно організувати циклічний перебір номерів картинок і виведення поточної картинки Позначимо номер картинки через nPicture і опишемо цю змінну в WinMain:

nPicture dw  0

imglbmp

img4bmp

Малюнок 22

Власне перебір номерів картинок здійснюється при обробці повідомлення WMPAINT у віконній функції:

WndProc proc

hWin        :DWORD,

uMsg        :DWORD,

wParam    :DWORD,

lParam      :DWORD

LOCAL hDC LOCAL  Ps LOCAL hold

DWORD

PAINTSTRUCT

DWORD

.if uMsg == WM CREATE

. Elseif uMsg == WM_PAINT invoke Sleep, 200 затримка, щоб зображення не мінялися дуже швидко вибір номера наступної картинки так, щоб номери змінювалися циклічно від 100 до 400 If nPicture == 400

mov nPicture,100 elseif

add nPicture,100

.endif

invoke LoadBitmap, hInstance, nPicture завантажимо поточну картинку

mov hBmp, eax запамятаємо її дескриптор

invoke BeginPaint, hWin, ADDR Ps отримаємо контекст пристрою і запамятаємо його в ЕАХ

mov hDC, eax викличемо функцію малювання

invoke Paint_Proc, hWin, hDC повернемо контекст пристрою системі

invoke EndPaint, hWin, ADDR Ps оновлення всієї клієнтської області вікна hWnd недійсною

invoke RedrawWindow,hWnd,NULL, NULL,

RDW_INVALIDATE return 0 elseif uMsg == WM_DESTROY

invoke PostQuitMessage, NULL посилка повідомлення WM_QUIT в чергу потоку endif

invoke DefWindowPrос, hWin, uMsg, wParam, lParam ret WndProc endp

У функції PaintProc Осущетвляется висновок поточного растра:

Paint_Proc proc hWin   :DWORD, hDC    :DWORD

LOCAL   hold   :DWORD

LOCAL memDC: DWORD створюємо сумісний контекст

invoke CreateCompatibleDC,hDC

mov memDC, eax вибираємо в сумісний контекст дескриптор растра

invoke SelectObject, memDC, hBmp і зберігаємо дескриптор старого зображення

mov hold, eax виводимо растр

invoke BitBlt, hDC, 238,30,352,288, memDC, 0,0, SRCCOPY повертаємо в сумісний контекст дескриптор старого зображення

invoke SelectObject,hDC,hold

invoke DeleteDC,memDC

return 0 Paint_Proc endp

Для реалізації виведення послідовності зображень в різних місцях клієнтської області можна використовувати таймер і при обробці повідомлення WMTIMER у віконній функції змінювати номер зображення і координати виводу:

.elseif uMsg == WM_TIMER inc nom_±mg if nom_±mg =  500

mov nom_ ± mg, 100 endif збільшимо координату х зображення

inc x_img

; збільшимо координату у зображення

inc y_img

У функції виведення растра завантажується зображення з номером nomimg і потім виводиться:

invoke LoadBitmap,   hlnstance   ,nom_img mov img_BMP,eax invoke CreateCompatibleDC,hDC mov memDC,   eax

invoke SelectObj ect, memDC, img_BMP mov hold, eax виведення зображення invoke BitBlt, hDC, x_img, y_img, 100,60, memDC, 0,0, SRCCOPY invoke SelectObject, hDC, hold

Для організації затримок при виведенні растрів можна використовувати наступне макровизначення:

delay MACRO  num

invoke GetTickCount mov dval,   eax add dval,   num while eax &lt dval

invoke GetTickCount endw ENDM

Розглянемо висновок рухомого обєкту, наприклад, автомобіля, причому при русі будемо використовувати кілька растрів з автомобілем, які відрізняються кутом повороту коліс і наявністю вихлопних газів

Ресурси описані у файлі rsrcrc:

1&nbsp BITMAP MOVEABLE   PURE LOADONCALL DISCARDABLE &quotcarlbmp&quot

2&nbsp BITMAP MOVEABLE   PURE LOADONCALL DISCARDABLE &quotcar2bmp&quot

3&nbsp BITMAP MOVEABLE   PURE LOADONCALL DISCARDABLE &quotcar3bmp&quot

4&nbsp BITMAP MOVEABLE   PURE LOADONCALL DISCARDABLE &quotcar4bmp&quot

5&nbsp BITMAP MOVEABLE   PURE LOADONCALL DISCARDABLE &quotcar5bmp&quot

6&nbsp BITMAP MOVEABLE   PURE LOADONCALL DISCARDABLE &quotcar6bmp&quot

Бібліотеки, прототипи функцій і макроозначення описані у файлі line:

; файли, що включаються

include з:\MASM32\INCLUDE\windows Inc include з:\MASM32\INCLUDE\masm32inc include з:\MASM32\lNCLUDE\gdi32 Inc include з:\MASM32\INCLUDE\user32inc include з:\MASM32\lNCLUDE\kernel32 Inc включаються бібліотеки

includelib з:\MASM32\LIB\masm32 Lib includelib з:\MASM32\LIB\gdi32 Lib includelib з:\MASM32\LIB\user32 Lib includelib з:\MASM32\LIB\kernel32 Lib прототипи функцій

WinMain PROTO :DWORD

WndProc PROTO: DWORD,: DWORD,: DWORD,: DWORD Paint_Proc PROTO: DWORD,: DWORD,: DWORD Pause PROTO: DWORD Макроси

szText MACRO Name, Text: VARARG LOCAL 1И jmp 1И Name db Text, 0 1И: ENDM

m2m MACRO Ml, M2 push M2 pop Ml ENDM

return MACRO arg mov eax, arg ret ENDM data

szDisplayName db Приклад, 0
sze                          dd 0

var3                        dd 0

hWnd                        dd 0

hlnstance    dd 0
hBmp                        dd 0

x_x                          dd 0

; координата автомобіля

Текст програми, що реалізує висновок растрових зображень:

.model flat, stdcall

option casemap :none

include 1inc

. code

start:

invoke GetModuleHandle, NULL mov hlnstance, eax invoke WinMain, hlnstance invoke ExitProcess, eax головна функція WinMain proc hlnst: DWORD

LOCAL wc   :WNDCLASSEX

LOCAL msg  :MSG

szText szClassName,&quotmyClass&quot

mov wccbSize,                       sizeof WNDCLASSEX

mov wcstyle,                         CS_BYTEALIGNWINDOW

mov wclpfnWndProc,    offset WndProc

mov wccbClsExtra,     NULL

mov wccbWndExtra,     NULL

m2m wchlnstance,      hlnst

mov wchbrBackground,  COLOR_WINDOW

mov wclpszMenuName,   NULL

mov wclpszClassName,  offset szClassName

m2m wchlcon,                      NULL

invoke LoadCursor,NULL,IDC_ARROW

mov wchCursor,        eax

m2m wchlconSm,       NULL

invoke RegisterClassEx, ADDR wc

invoke CreateWindowEx,WS_EX_LEFT,

ADDR szClassName, ADDR szDisplayName, WS_OVERLAPPEDWINDOW, 200,300,420,200, NULL,NULL, hlnst,NULL mov hWnd,eax invoke ShowWindow,hWnd,SW SHOWNORMAL

invoke UpdateWindow,hWnd StartLoop:

invoke GetMessage,ADDR msg,NULL,0,0 cmp eax, 0 je ExitLoop

invoke DispatchMessage,  ADDR msg jmp StartLoop ExitLoop:

return msgwParam WinMain endp

; віконна функція WndProc proc hWin: DWORD, uMsg: DWORD, wParam: DWORD, lParam: DWORD LOCAL count: DWORD LOCAL pic: DWORD

Local cordx: DWORD локальна координата х LOCAL hDC: DWORD LOCAL Ps: PAINTSTRUCT LOCAL tm: TEXTMETRIC LOCAL hPen: DWORD LOCAL hPenp: DWORD szText TT, My car szText TTl, Best if uMsg == WM_CREATE invoke GetDC,hWin mov hDC,eax

invoke CreatePen, PS_DASHDOT, 20,00 f59411h створення пера

mov hPen, eax збереження дескриптора пера invoke ReleaseDC, hWin, hDC return 0 elseif uMsg = WM_PAINT

invoke BeginPaint,hWin,ADDR Ps mov hDC, eax mov count,0 mov pic,1 mov cordx,20

. While count <17; цикл виведення зображення invoke LoadBitmap, hInstance, pic mov hBmp, eax inc count

add cordx,5

invoke Paint_Proc,hWin,hDC,cordx

invoke Pause,12000

.if pic==l

mov pic,2 else

mov pic,1 endif endw

mov count,0 mov pic,3

. While count <12; цикл виведення зображення invoke LoadBitmap, hInstance, pic mov hBmp, eax inc count add cordx, 10

invoke Paint_Proc,hWin,hDC,cordx invoke Pause,10000 if pic==3

mov pic,4 else

mov pic,3 endif endw

mov count,0 mov pic,5

. While count <14; цикл

виведення зображення

invoke LoadBitmap,hInstance,pic

mov hBmp, eax

inc count

add cordx,15

invoke Paint_Proc,hWin,hDC,cordx

invoke Pause,8000

.if pic==5

mov pic,6 else

mov pic,5 endif endw

invoke SetBkMode, hDC, l прозорий фон invoke SetTextColor, hDC, 00f3434h зміна кольору шрифту

invoke TextOut, hDC, 140,10, ADDR TT, 8 висновок рядка ТТ

invoke SelectObject, hDC, hPen вибір дескриптора шрифту

mov hPenp, eax збереження дескриптора за замовчуванням

invoke SetTextColor, hDC, 003252ffh зміна кольору шрифту mov eax, 10h

invoke TextOut, hDC, 230,10, ADDR TT1, 4 висновок рядка ТТ1

invoke SelectObject,hDC,hPenp invoke EndPaint,hWin,ADDR Ps return 0 elseif uMsg == WM_DESTROY

invoke DeleteObject, hPen видалення дескриптора пера

invoke PostQuitMessage,NULL return 0 endif

invoke DefWindowProc, hWin, uMsg, wParam, IPar am ret WndProc endp процедура малювання

Paint_Proc proc hWin:DWORD, hDC:DWORD, cord:DWORD LOCAL hold:DWORD LOCAL memDC :DWORD invoke CreateCompatibleDC,hDC mov memDC, eax

invoke SelectObject, memDC, hBmp mov hold, eax копіювання з памяті у вікно if cord> = 225 invoke BitBlt, hDC, cord, 50,120,80, memDC, 0,0, SRCPAINT else

invoke BitBlt,hDC,cord,50,120,80,memDC,0,0,SRCCOPY endif

invoke SelectObject, hDC, hold invoke DeleteDC, memDC return 0 Paint_Proc endp функція для затримки Pause proc m: DWORD while m> 0 push m while m> 0 dec m endw pop m

sub m,l endw return 0 Pause endp

27 Вправи

Написати програму, що здійснює:

1 Виведення тексту з використанням не менше ніж двох типів шрифтів

2 Висновок графічних примітивів (прямокутники, еліпси, дуги тощо) з використанням різних піря і кистей для заливки

3 Висновок міні-мультфільму за сюжетом

Приклади завдань для мультфільму:

1&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Море з видимою лінією горизонту і пливе кораблик

2&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Розпускається квітка

3&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Кот, який біжить за мишкою

4&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Будиночок, з труби якого йде дим

5&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Сніговик, що тане після появи сонечка

6&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp З яблуні падає яблуко

7&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Сонячне затемнення

8&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp На ясному небі зявляється хмарка, йде дощ, потім зявляється веселка

9&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Золота рибка плаває в акваріумі

10 У прозорий стакан капає вода з крана, рівень води збільшується

11 Політ ракети в космосі

12 Рухомий автомобіль з мигалкою

13 Олівець, який малює кілька різнокольорових ліній

14 Летить метелик

15 Курча, клюющій зерно

16 Політ Вінні-Пуха на повітряній кульці

17 Стрибок людини з парашутом з літака

18 Політ літаючої тарілки із зміною її кольору

19 Людина, перестрибувати через перешкоду

20 Годинник з рухомими стрілками

21 Годинник з електронним циферблатом

22 Годинник із зозулею

23 Паровоз тягне вагон, з труби йде дим

24 Спливаюча підводний човен

25 Захід сонця

28 Контрольні питання

1 Що таке GDI

2 Що таке контекст пристрою

3 Які графічні обєкти Ви знаєте

4 Що таке регіон Перерахуйте типи регіонів

5 Як обробляється повідомлення WMPAINT

6 Яке призначення мають функції GetDC і ReleaseDC

7 Поясніть логіку роботи з інструментами малювання Які функції при цьому використовуються і де викликаються

8 Пояснюючи призначення функції SelectObject

9 Яке перо використовується за умовчанням

10 Які параметри вказуються для завдання пера

11 Як запросити для використання дескриптор стандартної кисті

12 Які функції використовуються для створення нестандартних кистей

13 Перерахуйте параметри шрифту

14 Які шрифти GDI Ви знаєте

15 Що таке базова лінія для фізичного шрифту

16 Як змінити колір символів

17 Що таке системна палітра

18 Як формується логічна палітра

19 Які типи растрів Ви знаєте

20 Поясніть використання ресурсів у додатку

21 Навіщо використовується ідентифікатор ресурсу

22 Що таке сумісний контекст

23 Як здійснюється виведення DDB-растра

24 Які параметри має функція BitBlt

25 Яке призначення має функція StretchBlt

Джерело: Сучкова, ЛІ Win32 API: основи програмування: навчальний посібник / ЛІ Сучкова АлтГТУ ім ШІ Ползунова -Барнаул, АлтГТУ, 2010 138 с, іл

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*