
Экранная лупа на Ассемблере
Алгоритм реализации экранной лупы достаточно простой. Надо получить часть изображения рабочего стола и скопировать его с масштабированием в нужную область вашего приложения. Сделать это можно при помощи функции StretchBlt. Если посмотрите описание, то увидите, что для работы этой функции требуются следующие параметры: размеры результирующей области, размеры исходной области и контексты устройств (окон), в которых находятся области. А поскольку мы сейчас разрабатываем лупу, значит она должна увеличивать, то есть размеры исходного окна должны быть пропорционально меньше результирующего. Коэффициент пропорциональности и есть коэффициент увеличения лупы. При инициализации окна выполним предварительные расчеты:Code (Assembler) : Убрать нумерацию
- ...
- ; Получить контекст окна лупы
- invoke GetDlgItem,[hwnddlg],ID_ZOOM
- mov ebx,eax
- invoke GetDC,eax
- mov [wDC],eax
- ; Получить размеры окна лупы
- invoke GetClientRect,ebx,coord
- mov eax,[coord.right]
- sub eax,[coord.left]
- mov [dWidth],eax
- mov eax,[coord.bottom]
- sub eax,[coord.top]
- mov [dHeight],eax
- ; Получить контекст десктопа
- invoke GetDesktopWindow
- mov [hDesktop],eax
- invoke GetDC,eax
- mov [dDC],eax
- ...
Еще один важный момент. Координаты курсора соответствуют левому верхнему углу копируемой части экрана. Но для большего эффекта надо копировать фрагмент вокруг курсора, так что потребуется небольшая корректировка координат. Итак, код основной процедуры экранной лупы:
Code (Assembler) : Убрать нумерацию
- ; Получить позицию курсора
- invoke GetCursorPos,curs
- ; Расчитать координаты и размер копируемой