Могу ли я написать экранную лупу на REALbasic?

#screen-scraping #screen #pixel #realbasic

#очистка экрана #экран #пиксель #realbasic

Вопрос:

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

Что-нибудь?

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

Ответ №1:

Существует несколько способов создания как лупы, так и пипетки для глаз с помощью Realbasic (shameless plug: некоторое время назад я написал пипетку для глаз на REALbasic.) Это очень просто, просто вызовите систему. Функция Pixel с использованием System.mouseX и System.Мышь в качестве ее параметров. Система.Pixel возвращает цвет, соответствующий цвету пикселя в заданных вами координатах экрана.

С помощью этой информации о цвете вы можете (очевидно) показать цвет в большем масштабе, рисуя на объекте Picture или элементе управления Canvas (как с помощью пипетки).)

Этот метод можно использовать для чего-то вроде лупы, но, вероятно, не следует. Рисование попиксельно в REALbasic может быть довольно медленным, что при выполнении задач реального времени, таких как использование лупы, приведет к проблемам с производительностью и мерцанию.

В Windows и, вероятно, в Mac OS X и GTK существуют функции API, которые позволяют захватывать область экрана, что полезно для создания скриншотов и для манипулирования растровыми изображениями с использованием ряда стандартных алгоритмов.

Вот простая функция, которая вызывает Windows API для захвата части экрана размером 800×600, увеличения ее в 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 = amp;h40000000
  Const SRCCOPY = amp;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
  

Примерно в то же время, когда я писал эту пипетку, я также написал проект basic magnifier. Вы можете загрузить файл проекта здесь. В дополнение к демонстрации вышеупомянутой функции, она также может служить базовой демонстрацией рисования на холсте без мерцания, использования объекта REALbasic Picture в контекстах устройств Windows GDI и использования потоков для выгрузки работы из основного потока.

Комментарии:

1. Именно то, что я искал. Спасибо! Теперь еще один вопрос… (поймите, я еще даже не скачал демо, так как не хочу тратить свое время, если это невозможно сделать …) Вы показываете, как это сделать через Windows, но я, конечно, хочу, чтобы это было кроссплатформенным, следовательно, даже учитывая RS / RB. Как мне указать «При компиляции для Windows используйте ‘x’, но при компиляции для Mac используйте ‘Y'». Если бы вы могли обновить свой пример, даже с помощью искусственных вызовов для стороны Mac, это было бы здорово!

2. На заметку… БЛИН, это навевает воспоминания о программировании на Win32! 🙂

3. Не обращайте внимания на последний вопрос. Просмотрев ваш код, я нашел то, что мне было нужно. Спасибо! 🙂

4. Правильно, вы можете использовать директивы компилятора #If Target … , чтобы изменить, какой код компилируется для каждой платформы.

Ответ №2:

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

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