Могу ли я написать экранную лупу в RealBasic?
Я хочу создать экранную лупу в RealBasic, но не вижу классов или API-интерфейсов для чтения областей экрана, которые можно затем отобразить в моем окне.
Что-нибудь?
Дополнительный вопрос: если я не могу прочитать целые области, могу ли я по крайней мере сделать чтение на пиксель, чтобы имитировать пипетку, которая считывает цвет пикселя под курсором?
2 ответа
Есть несколько способов сделать лупу и пипетку с помощью Realbasic (бесстыдный плагин: я недавно написал пипетку в RealBasic.) Это очень просто, просто вызовите функцию System.Pixel, используя System.MouseX и System.MouseY как его параметры. System.Pixel возвращает цвет, соответствующий цвету пикселя с указанными вами координатами экрана.
С помощью этой информации о цвете вы можете (очевидно) показать цвет в большем масштабе, рисуя объект Picture или элемент управления Canvas (как с помощью пипетки).
Этот метод может использоваться для чего-то вроде лупы, но, вероятно, не должно быть. Рисование попиксельно в RealBasic может быть довольно медленным, что при выполнении задач в реальном времени, таких как лупа, может привести к проблемам с производительностью и мерцанию.
В Windows, а также, вероятно, в Mac OS X и GTK+, есть функции API, которые позволяют вам захватывать область экрана, которая полезна для снимков экрана, и для управления растровыми изображениями с использованием ряда стандартных алгоритмов.
Вот простая функция, которая вызывает Windows API для захвата части экрана размером 800x600, увеличения ее на 3 и копирования в объект Picture:
Function GetZoomedPic() As Picture
Declare Function GetDesktopWindow Lib "User32" () As Integer
Declare Function GetDC Lib "User32" (HWND As Integer) As Integer
Declare Function StretchBlt Lib "GDI32" (destDC As Integer, destX As Integer, destY As Integer, destWidth As Integer, destHeight As Integer, _
sourceDC As Integer, sourceX As Integer, sourceY As Integer, sourceWidth As Integer, sourceHeight As Integer, rasterOp As Integer) As Boolean
Declare Function ReleaseDC Lib "User32" (HWND As Integer, DC As Integer) As Integer
Const CAPTUREBLT = &h40000000
Const SRCCOPY = &HCC0020
Dim coordx, coordy As Integer
Dim magnifyLvl As Integer = 3
Dim screenCap As New Picture(800, 600, 32)
coordx = System.MouseX - (screenCap.Width \ (magnifyLvl * 2))
coordy = System.Mousey - (screenCap.Height \ (magnifyLvl * 2))
Dim rectWidth, rectHeight As Integer
rectWidth = screenCap.Width \ magnifyLvl
rectHeight = screenCap.Height \ magnifyLvl
Dim deskHWND As Integer = GetDesktopWindow()
Dim deskHDC As Integer = GetDC(deskHWND)
Call StretchBlt(screenCap.Graphics.Handle(1), 0, 0, screenCap.Width, screenCap.Height, DeskHDC, coordx, coordy, rectWidth, _
rectHeight, SRCCOPY Or CAPTUREBLT)
Call ReleaseDC(DeskHWND, deskHDC)
Return screenCap
End Function
Примерно в то же время я написал Eyedropper, я также написал базовый проект лупы. Вы можете скачать файл проекта здесь. В дополнение к демонстрации вышеупомянутой функции, она также может служить основной демонстрацией рисования на холсте без мерцания, использования объекта RealBasic Picture с контекстами устройства Windows GDI и использования потоков для выгрузки работы из основного потока.
Посмотрите эту тему на форумах Real Software по этой теме. Похоже, есть несколько решений, которые вы можете попробовать.
http://forums.realsoftware.com/viewtopic.php?f=10&t=7818&hilit=screen+magnifier