Приклади виведення в клієнтську область вікна графіки і тексту
Нехай у додатку необхідно виводити в клієнтську область вікна текст, графічні примітиви і растрове зображення Для того щоб можна було виконувати цей висновок незалежно і в потрібній послідовності, будемо при натисканні клавіші «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, " *As sembler* " szText FontO,"Times New Roman" s z Text Fontl,"Century Go thic" szText Font2,"Monotype Corsiva" 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±>
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±>
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±>
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>. lbS tyle, BS_HATCHED mov XblbColor,000000FFh mov 1±>. lbHatch, 0
invoke CreateBrushlndirect,addr 1±> 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 "imglbmp"
200 BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "img2bmp"
300 BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "img3bmp"
400 BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "img4bmp"
Ідентифікатори растрових зображень при такому описі-це числа 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 < dval
invoke GetTickCount endw ENDM
Розглянемо висновок рухомого обєкту, наприклад, автомобіля, причому при русі будемо використовувати кілька растрів з автомобілем, які відрізняються кутом повороту коліс і наявністю вихлопних газів
Ресурси описані у файлі rsrcrc:
1  BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "carlbmp"
2  BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "car2bmp"
3  BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "car3bmp"
4  BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "car4bmp"
5  BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "car5bmp"
6  BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "car6bmp"
Бібліотеки, прототипи функцій і макроозначення описані у файлі 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,"myClass"
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                    Море з видимою лінією горизонту і пливе кораблик
2                    Розпускається квітка
3                    Кот, який біжить за мишкою
4                    Будиночок, з труби якого йде дим
5                    Сніговик, що тане після появи сонечка
6                    З яблуні падає яблуко
7                    Сонячне затемнення
8                    На ясному небі зявляється хмарка, йде дощ, потім зявляється веселка
9                    Золота рибка плаває в акваріумі
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 с, іл
Схожі статті:
- Перші кроки з CA ERwin Process Modeler. Частина 8 (0)
- Індикація ходу виконання тривалих операцій (0)
- Поради з програмування на DELPHI (ч.6) (0)
- Індикація ходу виконання тривалих операцій, Windows Forms, ASP, статті (0)
- Поради з програмування на DELPHI (ч.5), Різне, Програмування, статті (0)
- Як написати оболонку для Краків / кейгена під win95/98/NT/2000, Безпека ПЗ, Security & Hack, статті (0)
- Bitmap-індекс або B * tree-індекс: який і коли застосовувати?, Інші СУБД, Бази даних, статті (0)
Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.
Коментарів поки що немає.
Ваш отзыв
Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>