【问题标题】:Can I write a screen magnifier in RealBasic?我可以在 RealBasic 中编写屏幕放大镜吗?
【发布时间】:2011-11-13 21:40:15
【问题描述】:

我想在 RealBasic 中创建一个屏幕放大镜,但没有看到任何用于读取屏幕区域的类或 API,然后我可以渲染到我的窗口。

有什么事吗?

附带问题:如果我无法读取整个区域,是否可以至少进行逐像素读取来模拟读取光标下像素颜色的吸管工具?

【问题讨论】:

    标签: screen-scraping screen pixel realbasic


    【解决方案1】:

    Realbasic有几种方法可以同时制作放大镜和滴管(无耻插件:我前段时间写了一个eyedropper in RealBasic。)很简单,只需使用@987654323调用System.Pixel函数即可@ 和 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
    

    大约在我写那个吸管的同时,我还写了一个基本的放大镜项目。您可以下载项目文件here。除了演示上述功能外,它还可以作为基本演示,演示如何在不闪烁的情况下绘制到 Canvas、使用带有 Windows GDI 设备上下文的 RealBasic Picture 对象以及使用线程从主线程中卸载工作。

    【讨论】:

    • 正是我想要的。谢谢!现在另一个问题...(了解我什至还没有下载演示,因为如果无法完成,我不想浪费我的时间...)你展示了如何通过 Windows 来做到这一点,但我当然希望这是跨平台的,因此甚至考虑 RS/RB。如何指示“在为 Windows 编译时,使用‘x’,但在为 Mac 编译时,使用‘Y’。”如果您可以更新您的示例,即使在 Mac 端使用虚假调用,那就太好了!
    • 附带说明... MAN,这让我们想起了 Win32 编程! :)
    • 不要介意最后一个问题。查看您的代码,我找到了我需要的东西。谢谢! :)
    • 对,你可以使用#If Target...编译器指令来改变每个平台编译的代码。
    【解决方案2】:

    查看 Real Software 论坛上有关此主题的主题。看起来您可以尝试多种解决方案。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 2014-09-26
      • 2021-04-15
      • 1970-01-01
      相关资源
      最近更新 更多