RealBasic で拡大鏡を作成したいのですが、ウィンドウにレンダリングできる画面の領域を読み取るためのクラスまたは API がありません。
なんでも?
補足質問: 領域全体を読み取ることができない場合、少なくともピクセルごとの読み取りを行って、カーソルの下のピクセルの色を読み取るスポイト ツールをシミュレートできますか?
RealBasic で拡大鏡を作成したいのですが、ウィンドウにレンダリングできる画面の領域を読み取るためのクラスまたは API がありません。
なんでも?
補足質問: 領域全体を読み取ることができない場合、少なくともピクセルごとの読み取りを行って、カーソルの下のピクセルの色を読み取るスポイト ツールをシミュレートできますか?
Realbasicで拡大鏡とスポイトの両方を作成する方法はいくつかあります(恥知らずなプラグ:少し前にRealBasicでスポイトを作成しました)。非常に簡単で、System.MouseXとSystemを使用してSystem.Pixel関数を呼び出すだけです。パラメータとして.MouseY。System.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オブジェクトの使用、およびメインスレッドから作業をオフロードするためのスレッドの使用の基本的なデモンストレーションとしても機能します。
このトピックに関する Real Software フォーラムのこのスレッドを見てください。あなたが試すことができる多くの解決策があるようです。
http://forums.realsoftware.com/viewtopic.php?f=10&t=7818&hilit=screen+magnifier