2011-11-13 6 views
0

RealBasicでスクリーン拡大鏡を作成したいのですが、私のウィンドウにレンダリングできる画面の領域を読み込むためのクラスやAPIは表示されません。RealBasicでスクリーン拡大鏡を書くことはできますか?

何でもいいですか?

サイド質問:領域全体を読み取ることができない場合は、ピクセル単位の読み取りを行い、カーソルの下のピクセルの色を読み取るアイドロップツールをシミュレートできますか?

答えて

2

拡大鏡と点眼両方がREALbasicので作ることができるいくつかの方法があります(恥知らずなプラグイン:。私はしばらく前にeyedropper in RealBasicを書いたが)それはちょうど使用してSystem.Pixel関数を呼び出す、非常に簡単ですSystem.MouseXおよびSystem.MouseYをパラメータとする。 System.Pixelは、指定した画面座標のピクセルの色に対応するの色を返します。あなたは(明らかに)PictureオブジェクトまたはCanvasコントロールに描画することにより、より大きなスケールで色を表示することができ、この色情報で

(スポイトのように。)

このメソッドは次のように使用することができますしかし、おそらくそうではありません。 RealBasicでピクセル単位で描画することは非常に遅くなる可能性があります。これは、ルーペのようなリアルタイムタスクでは、パフォーマンスの問題やちらつきにつながります。

Windowsでは、おそらくMac OS XとGTK +の下では、画面の領域をキャプチャするためのAPI関数が用意されています。これはスクリーンショットに役立ち、多くの標準アルゴリズムを使用してビットマップ画像を操作します。ことを私が書いた同じ頃

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 

:ここ

は、画面の800x600の一部分をキャプチャ3で、それを拡大して、Pictureオブジェクトにコピーするには、Windows APIを呼び出す簡単な関数でありますEyedropper、私はまた、基本的な拡大鏡プロジェクトを書いた。プロジェクトファイルhereをダウンロードできます。上記の機能のデモンストレーションに加えて、FlickeringなしでCanvasに描画するための基本的なデモンストレーション、Windows GDIデバイスコンテキストでのRealBasic Pictureオブジェクトの使用、およびスレッドを使用してメインスレッドから作業をオフロードすることもできます。

+0

私が探していたものです。ありがとう!今、別の質問...(これはできない場合、私は時間を無駄にしたくないので、まだデモをダウンロードしていないことを理解しています...)あなたはWindowsでこれを行う方法を示していますが、もちろん、これはクロスプラットフォームであり、したがってRS/RBも考慮してください。 「Windows用にコンパイルする場合は「x」を使用しますが、Mac用にコンパイルする場合は「Y」を使用するように指示するにはどうすればよいですか。あなたの例を更新することができれば、たとえMac側の偽の呼び出しであっても、それは素晴らしいだろう! – MarqueIV

+0

サイドノートで...これはWin32プログラミングの思い出をもたらします! :) – MarqueIV

+0

最後の質問がネフマインド。あなたのコードを見て、私は必要なものを見つけました。ありがとう! :) – MarqueIV