Могу ли я написать экранную лупу в 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

Другие вопросы по тегам