Vectorで公開されているフリーウェアで、「梨ズーム」というのがあります。
デスクトップ画面をまるごと 2倍や3倍に拡大表示できて、そのまま操作もできるとい
うものです。
・・・ こういうのって、どんな仕組で実現しているのでしょうか?
といいますのも、梨ズームはベンリなんですが、ズーム拡大した状態で
タッチパネルで操作しようとすると、表示とタッチペンの位置がズレてしまいます。
これは、ズーム拡大後も タッチペンでのポイント位置は通常状態のままで動いているか
らだと思われるので、こうしたトコをフォローして、タッチペンでもそのまま操作できる
ツールを自作したいなと思いつきました。
タッチペンの補正はなんとかできると思っているのですが、そもそもデスクトップ全体を
拡大表示するロジックがわかりません。
どなたか情報をお持ちではないですか?
拡大表示そのものは、デフォルトのDC拾ってそれをStretchBltするとかで簡単に
出来るが、制約が幾つかあります。
たとえば、レイヤードウィンドウは表示されず、オーバレイも拡大できません。
まぁ、このへんは梨ズームも同じようですが。
面倒なのは操作できるようにしたまま拡大すると言う事だとおもいます。
梨ズームの操作できるようにする仕掛けが今一分かりませんが、デフォルトのDC
に直接描画するとか、クリックなどのメッセージを真下のウィンドウに転送するトッ
プレベルウィンドウを作るとかで、似たような機能を持たせる事は出来ると思いま
す。
…梨ズームの実装を適当に推測すると、マウスメッセージを真下のウィンドウに
転送する機能を持ったレイヤードウィンドウを最前面で表示して、タイマを使って
定期的にデスクトップの画像を取得して、拡大表示しているのだと思います。
レイヤードウィンドウを使わないとデスクトップの画像の取得にデフォルトのDCを使
えないので、レイヤードウィンドウ無しでデフォルトのDCも使っていないかもしれま
せん。
麩さんへ:
貴重な情報ありがとうございます!
梨ズームを稼動した状態で、
画面のプロパティ -> 設定 で 解像度を変化させる(VGA -> XVA)と
ズーム領域が VGAのサイズのままとなって、その外側にデスクトップが
通常サイズで表示されました。
ここから、最上層にレイヤードウィンドウを表示しているのではないかと思います。
もうちょっとかかりそうですが、対応の筋道が見えてきました。
>ここから、最上層にレイヤードウィンドウを表示しているのではないかと思いま
す。
ぇーと、解像度の変更でズーム領域が限定されるからと言って、ウィンドウに描画
してるとは限りません。
デフォルトのDC(GetDC(NULL)等)に直接描画する場合、画面サイズを梨ズー
ム側で保持している可能性もあります。
ただ、タイマで描画するソフトが複数あっても梨ズームのズーム画像が上書きさ
れない事から、何かしらのウィンドウが存在する可能性がある、と推測していま
す。
再描画を禁止する事や、各ウィンドウの描画先をメモリDCに変える方法もあるら
しいので、その可能性もあるんですよね。
ただ、やjはり一番簡単なのはレイヤードウィンドウだと思います。
拡大処理は何も考えずフルサイズのレイヤードウィンドウを作ってデフォルトのDC
から、自ウィンドウに拡大転送するだけですむはずですから。
麩さんへ:
とりあえず、レイヤード ウィンドウで 真下のデスクトップ画面のDCを取得して、
拡大表示できるところまで到りました。
デスクトップの静止画キャプチャみたいな状態です。
今は、自分のウィンドウで受け取ったマウスクリックを
下のウィンドウに引き渡すのに てこずってますが、ココをクリアできれば
なんとか目指すものになりそうです。
麩さんへ:
おかげさまで、無事 梨ズーム相当の動作をするツールのプロトタイプが作成できました。
梨ズームの中が本当にどう動いているのかは 判らないのですが、
次のようにウィンドウを構築することで、目的とした動作が行えました。
1) フルサイズのレイヤード ウィンドウに WM_EX_TOPMOSTと
WM_EX_TRANSPARENT 属性をつける。
これにより、全てのマウスイベントが 素通りして、直接 下のウィンドウに届くよ
うになる
2) タイマーイベントを使って、一定間隔で デスクトップのDCから 画像情報を取得し、
拡大表示する。
3) 2)を行うときに、GetCursolPos() で マウスカーソルの位置も取得し、
拡大表示する範囲を
「マウスカーソルの位置が 直接 下の拡大前のウィンドウでの座標と一致する」
ようにドンドンずらしていく。
拡大表示されている マウスカーソルの真下が、必ず拡大前のウィンドウと一致する
ように、拡大表示の領域をズラし続けることで、マウス操作が可能となりました。
ありがとうございます!
おめでとうございます。
…WS_EX_TRANSPARENTの動作はレイヤードウィンドウだと違うんですね…。
マウスイベントの透過自体はOSレベルでサポートされていた訳ですか。
後、ちょっとした事ですが、梨ズームの場合拡大後(ズームウィンドウ生成後)に最
前面ウィンドウが作られると陰に隠れてしまうので、タイマなりメッセージなりで最
前面に移動させなおすコードを追加するとより効果的かもしれません。