Могу ли я написать экранную лупу в RealBasic? - PullRequest
0 голосов
/ 14 ноября 2011

Я хочу создать экранную лупу в RealBasic, но не вижу классов или API-интерфейсов для чтения областей экрана, которые можно затем отобразить в моем окне.

Все

Дополнительный вопрос: если я не могу прочитать целые области, могу ли я хотя бы выполнить считывание на пиксель для имитации пипетки, которая считывает цвет пикселя под курсором?

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

Есть несколько способов, как с помощью Realbasic можно сделать как лупу, так и пипетку (бесстыдный плагин: я недавно написал пипетку в RealBasic ). Это очень просто, просто назовите 1003 * Функция System.Pixel с использованием System.MouseX и System.MouseY в качестве параметров. System.Pixel возвращает Color , соответствующий цвету пикселя в указанных вами координатах экрана.

С помощью этой информации о цвете вы можете (очевидно) показать цвет в большем масштабе, рисуя объект 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 и использования потоков для выгрузки работы из основного потока.

1 голос
/ 14 ноября 2011

Посмотрите эту тему на форумах Real Software по этой теме. Похоже, есть несколько решений, которые вы можете попробовать.

http://forums.realsoftware.com/viewtopic.php?f=10&t=7818&hilit=screen+magnifier

...