0

RealBasic で拡大鏡を作成したいのですが、ウィンドウにレンダリングできる画面の領域を読み取るためのクラスまたは API がありません。

なんでも?

補足質問: 領域全体を読み取ることができない場合、少なくともピクセルごとの読み取りを行って、カーソルの下のピクセルの色を読み取るスポイト ツールをシミュレートできますか?

4

2 に答える 2

2

Realbasicで拡大鏡とスポイトの両方を作成する方法はいくつかあります(恥知らずなプラグ:少し前にRealBasicでスポイトを作成しました)。非常に簡単で、System.MouseXSystemを使用してSystem.Pixel関数を呼び出すだけです。パラメータとして.MouseYSystem.Pixelは、指定した画面座標のピクセルの色に対応する色を返します。

この色情報を使用すると、(スポイトのように)PictureオブジェクトまたはCanvasコントロールに描画することで、(明らかに)より大きなスケールで色を表示できます。

この方法は拡大鏡のようなものに使用できますが、おそらく使用すべきではありません。RealBasicでのピクセルごとの描画は非常に遅くなる可能性があり、拡大鏡などのリアルタイムタスクでは、パフォーマンスの問題やちらつきが発生します。

Windowsの場合、そしておそらくMac OSXと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

そのスポイトを書いたのとほぼ同時に、基本的な拡大鏡プロジェクトも書きました。ここからプロジェクトファイルをダウンロードできます。上記の機能のデモンストレーションに加えて、ちらつきのないCanvasへの描画、Windows GDIデバイスコンテキストでのRealBasicPictureオブジェクトの使用、およびメインスレッドから作業をオフロードするためのスレッドの使用の基本的なデモンストレーションとしても機能します。

于 2011-11-14T13:56:40.997 に答える
1

このトピックに関する Real Software フォーラムのこのスレッドを見てください。あなたが試すことができる多くの解決策があるようです。

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

于 2011-11-13T22:00:25.847 に答える