Листинг 16.8. Фрагменты приложения
в программе
приложения
для Win32 с использованием меню
;и
окна для перерисовки содержимого окна;
.386
применение локальных меток (с префиксом (
flat,
памяти flat,
;STDCALL - передача параметров в стиле С (справа
процедура чистит за собой стек
include
файл с описаниями базовых структур
;и констант Win32
include
файл с определением имен пунктов
;0бъявпение внешними используемых в данной
;функций Win32
extrn
extrn
extrn
extrn
extrn
extrn
extrn
extrn
extrn
extrn
extrn
extrn
extrn
extrn
extrn
extrn
:PROC
EndPaint:PROC
PatBlt:PROC
dd
dd
dd
глобальная переменная
глобальная переменная
;!!!это глобальная переменная
RECT>
. code
start proc near
;точка входа в программу:
start endp
;
proc
arg
uses ebx,
ebx ;эти регистры обязательно должны сохраняться
local
Углубленное программирование на ассемблере для Win32
je wmdestroy
cmp
je
cmp
je
crap
je
default
;создание растрового изображения, совместимого с окном приложения
;получим размер экрана в пикселах
push SM_CXSCREEN
call
maxX, eax
push SM_CYSCREEN
call GetSystemMetrics
mov
eax
;лолучить контекст устройства окна на экране
push
call GetDC
mov
eax
совместимый контекст устройства памяти
push
call CreateCompatibleDC
mov
eax
- глобальная переменная
;получить дескриптор растрового изображения в памяти
;
push maxY
push maxX
push @@hdc
call
mov
eax
растр в контекст памяти
push
push memdc
call SelectObject
первичное заполнение растра серым цветом
;получим дескриптор серой кисти
push
call GetStockObject
mov
eax
кисть в контекст памяти
@@hbrush)
push
push memdc
call SelectObject
выбранной кистью виртуальное окно
;BOOL PatBlt(HDC hdc, int nXLeft. int
int
DWORD
push PATCOPY
push maxY
push maxX
push NULL
push NULL
push memdc
call PatBlt
;освободим контекст устройства
push
push
call ReleaseDC
;обозначим создание окна звуковым эффектом
вызов функции BOOL PlaySound(LPCSTR pszSound,
DWORD fdwSound)
push
14
256
Глава 16. Создание Windows-приложений на ассемблере
push NULL
push offset playFileCreate
call PlaySoundA
значение О
mov
0
jmp
контекст устройства
push offset ps
push
call BeginPaint
mov @@hdc, eax
перерисовку окна звуковым эффектом
push
push NULL
push offset
call PlaySoundA
строку текста в окно
nYStart,
push
push offset
push 100
push 10
push
call TextOutA
вывод виртуального окна в реальное окно
BOOL
hdcDest, int nXDest, int nYDest, int nWidth,
int nHeight,
hdcSrc, i n t nXSrc, int nYSrc, DWORD
push SRCCOPY
push NULL
push NULL
push memdc
push
push maxX
push NULL
push NULL
push
call BitBlt
контекст BOOL
hWnd,
;CONST PAINTSTRUCT *lpPaint);
push offset ps
push
call EndPaint
mov eax, 0
значение - 0
jmp
процедуры обработки сообщений от меню
(DWORD
DWORD
push
push
call MenuProc
jmp
default:
exi
ret
endp
MenuProc- - -
;обработка сообщений от меню
Углубленное программирование на ассемблере для Win32
uses ebx
local
Ьх идентификатор меню
размер рабочей области BOOL GetClientRect(HWND
;LPRECT
push offset IpRect
push
call GetClientRect
строку текста в окно int
;LPCTSTR
int nCount, length,
;LPRECT IpRect,
push DT_SINGLELINE+DT_BOTTOM
push offset IpRect
push -1
push offset
push
call
сообщения
для вывода строки на экран
;BOOL InvalidateRect(HWND hWnd,
RECT
BOOL bErase)
push 1
push NULL
push
call InvalidateRect
jmp
строку текста в окно BOOL TextOut(HDC hdc, int nXStart,
;int nYStart, LPCTSTR IpString, int cbString)
push lenTXT_TEXTOUT
push offset
push 150
push 10
push memdc
call TextOutA
сообщения
для вывода строки на экран
push 0
push NULL
push
call InvalidateRect
jmp
jmp
jmp
jmp
jmp
jmp
mov eax, 0
ret
db
0
420 Глава
Создание Windows-приложений на ассемблере
Листинг
@@TXT_LACES
'
' , 0
db
Э
db
0
, 0
@@TXT_TEXTOUT db
выведен функцией
db
выведен функцией
0
start
Возможно, результаты работы программы из листинга 16.8 вам покажутся не
очень красивыми, но такая цель и не ставилась. Назначение этой программы —
исследовательское. Из-за задержек, вызванных воспроизведением звуковых фай-
лов, хорошо виден момент перерисовки окна. Такую технологию можно использо-
вать для более глубокого исследования механизмов работы Windows.
Do'stlaringiz bilan baham: |