Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Данные типа HDC представляют собой 32-разрядное целое беззнаковое число. После получения дескриптора контекста программа может использовать функции графического интерфейса, такие как TextOut и DrawText.
Указывать шрифт, цвет текста, цвет фона и расстояние между отдельными символами не нужно, поскольку эти атрибуты являются частью контекста устройства. Если по каким-либо причинам необходимо изменить один из этих атрибутов, то нужно вызвать соответствующую функцию. Перед началом рисования программа должна получить дескриптор контекста устройства. По окончании рисования программа должна освободить дескриптор. После освобождения дескриптор становится недействительным и использоваться не должен. Корректно работающая программа должна получать и освобождать дескриптор во время обработки каждого отдельного сообщения.

Дескриптор контекста устройства может быть получен одним из двух способов: • при обработке сообщений WM_PAINT. В этом случае используются функции BeginPaint и EndPaint. В качестве параметров эти функции принимают дескриптор,окна и адрес структуры PAINTSTRUCT, обычно именуемой как ps. Оконная процедура вызывает функцию BeginPaint в обработчике сообщения WM_PAINT. Функция возвращает в качестве результата дескриптор контекста в переменной типа нос, именуемой обычно hdc. После получения дескриптора контекста можно использовать функции рисования, например, TextOut или DrawText. Вызов функции EndPaint освобождает дескриптор контекста устройства. Процесс обработки сообщения WMPAINT, например в программе HELLOW ИЗ главе 4, будет выглядеть так, как представлено в листинге 5.1.
Листинг 5.1. Обработка сообщения WM PAINT
cmp uMsg, WM_PAINT
j ne next_l
lea EDX, ps
push EDX
push hWnd
call BeginPaint
mov hdc, EAX
push lenText
push offset textMes
push 100
push 100
push hdc
call TextOut
lea EDX, ps
push EDX
push hWnd
call EndPaint
ret

В случае, если сообщение WM_PAINT не обрабатывается, то оно должно передаваться в процедуру обработки сообщений по умолчанию DefWindowProc. Процедура DefWindowProc обрабатывает сообщения WM_PAINT, ВЫЗВаВ ПОДрЯД фуНКЦИИ BeginPaint И EndPaint, как ПОКазаНО в следующем фрагменте кода:
lea EDX, ps
push EDX
push hWnd
call BeginPaint
mov hdc, EAX
lea EDX, ps
push
push hWnd
EDX
call EndPaint
ret

• при обработке сообщений, отличных от WMPAINT, если возникает необходимость рисования, вызвав функцию GetDC.
Освободить дескриптор контекста можно с помощью функции WIN API ReieaseDC. Функция GetDC в качестве параметра принимает дескриптор окна приложения. Функция ReieaseDC в качестве параметров принимает дескриптор окна и дескриптор контекста, ранее созданный через вызов GetDC. Вывод текста и работу с контекстом устройства рисования с помощью функций WIN API BeginPaint и EndPaint мы рассмотрели в главе 4. Поэтому проанализируем второй метод получения дескриптора контекста. Для этого модифицируем наше приложение HELLOW.

Пусть требуется вывести строку текста при нажатии в окне приложения левой кнопки мыши. В этом случае в оконную процедуру необходимо включить обработчик сообщения WMLBUTTONDOWN. ИСХОДНЫЙ текст программы (назовем ее DRAWTEXT) приведен в листинге 5.2.
Листинг 5.2. Исходный текст программы DRAWTEXT
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib

szDisplayName DB "КОНТЕКСТ УСТРОЙСТВА И ВЫВОД ТЕКСТА
DRAWTEXT. ASM
.386
.model flat, stdcaii
option casemap :none различаем регистр символов
(ВАРИАНТ 2) ", О
CommandLine DD О
. code
start:
invoke GetModuleHandle, NULL
mov- hlnstance, EAX
invoke GetCommandLine
mov CommandLine, EAX
invoke WinMain, hlnstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, 0
WinMain proc hlnst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD
; Локальные переменные процедуры
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
; Заполнение структуры WNDCLASSEX требуемыми параметрами
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
push hlnst
pop wc.hlnstance
mov wc.hbrBackground, COLOR_BTNFACE+1
mov wc.IpszMenuName, NULL
mov wc.IpszClassName, offset szClassName
invoke , NULL, IDI APPLICATION mov wc.hlcon, EAX
invoke , NULL, IDC_ARROW mov wc.hCursor, EAX
mov wc.hlconSm, 0
invoke RegisterClassEx, ADDR wc invoke CreateWindowEx,
WS_EX_OVERLAPPEDWINDOW,ADDR szClassName,\
ADDR szDisplayName, WS_OVERLAPPEDWINDOW,\
CWJJSEDEFAULT, CWJJSEDEFAULT, CWJJSEDEFAULT, \
CWJJSEDEFAULT, NULL, NULL, hlnst, NULL
invoke ShowWindow, hWnd, SW_SHOWNORMAL invoke Updatewindow,
hWnd ; Цикл обработки сообщений
Программирование на ассемблере в Windows: от простого к сложному 251 StartLoop
invoke GetMessage, ADDR msg, NULL, 0, 0
cmp EAX, 0
je ExitLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
mov EAX, msg.wParam
ret
WinMain endp
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
LOCAL hdc :HDC
LOCAL rect :RECT
LOCAL coord :DWORD
cmp
jne
invoke
mov
invoke
mov
invoke
invoke
ret
next_l:
cmp
jne
invoke
xor
ret
next_2:
invoke
ret
uMsg, WM_LBUTTONDOWN
next_l
GetDC, hWnd
hdc, EAX
GetClientRect, hWnd, ADDR rect
coord, DT_CENTER or DT_SINGLELINE or DT_VCENTER
DrawText, hdc, ADDR textDraw, -1, ADDR rect, coord
ReieaseDC, hWnd, hdc
uMsg, WM_DESTROY
next_2
PostQuitMessage, NULL
EAX, EAX
DefWindowProc,hWin, uMsg, wParam, lParam
WndProc endp
end start

Для читателей, предпочитающих классический ассемблер без высокоуровневых структур, таких как if-else, while и invoke; приводим исходный текст только что рассмотренного примера. В листинге 5.3 приведен текст программы, где используются только команды ассемблера.


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru