虫眼鏡を作るには?

解決


KuroE−S  URL  2004-11-23 08:03:15  No: 55296

ヴィジュアルC++の勉強になって実用的なの作ろう!!と思ったので
虫眼鏡を作り始めたんです。それで、拡大鏡だったかな(=^ー^=)
ウィンドウズのアクセサリに入ってる虫眼鏡みたいのってありますよね!?
そいいうの作れないかなって試行錯誤したんです、でも自分のウィンドウ
が写っちゃってて写鏡みたいになっちゃうんです・(ノД`)・

今やってることなんですけど、GetDCでデスクトップを取ってきて
ScreenToClientで今のウィンドウの位置からデスクトップの表示する
位置を決めて、BitBltで自分のウィンドウに描いてます。

えと環境なんですけどo(‾□‾o)
  ウィンドウズ2000
  MicrosoftヴィジュアルC++6.0
  SDKです(MFCは今は使ってないです、勉強がんばりますd(‾‐‾*))

要するにやりたいことはってことなんですけれどにぇ(−ω−;)
自分のウィンドウは省いて、後ろの画面を拡大させたいんです!?
もし何か知ってる方がいましたら教えてくれると嬉しいです、お願いします!!


KuroE−S  2004-11-24 01:14:47  No: 55297

もし質問にわからない部分がありましたら訊いてください、
どうしても作りたいので・・・。


通りすがり  2004-11-24 10:40:01  No: 55298

>自分のウィンドウは省いて、後ろの画面を拡大させたいんです!?

論理的に矛盾している様な...

自ウィンドウををキャプチャしたくなければ、自ウィンドウを非表示にすれば
できますが、そうすると表示する場所がなくなってしまい、
再度表示させると、今度はキャプチャされてしまう...
BOOL値を一つトリガーとして持たせておいて、表示/非表示の切り替えと
キャプチャを交互に行えばできなくもなさそうですが、
例えばWM_MOUSEMOVEとか連続でやると、ちかちかしてしまいそう。

VC++6.0付属のZoominでも自分自身を表示しているし。

枠以外のクライアント領域なら、WM_ERASEBKGNDでキャプチャすれば
なんとかも?
アドバイスにならなくてすんません。


(noname)  2004-11-24 19:26:14  No: 55299

( ´ー`)y-~~ よう。
「ウィンドウの裏に隠れているウィンドウのビットマップを取得したい」
みたいな質問,定期的に出てくるな。
これ,いつも「無理」つー結論が出てんのな。
残念だけど,諦めれ ( ´Д`)y-~~

どうでもいいけど
> 後ろの画面を拡大させたいんです!?
この疑問符は何なんだ(笑い


PineSeed  2004-11-24 19:29:19  No: 55300

通りすがりさんも指摘しておられますが、
ウインドウが重なって隠れた部分のイメージは取得できません。
取得できないどころか、どこにもありません。
ですのでウインドウが移動などして隠れた場所が見えるようになると、
WM_PAINTが発生して各アプリケーションの責任で再描画されるわけです。

どうしてもということであれば、
ウインドウを一旦非表示にしてイメージを取得する必要がありますが、
静止画と画面のちらつきのトレードオフになるでしょう。

#Longhornになると各ウインドウにレイヤーが割り当てられる
#らしい(うろ覚え)ので、もしかすると可能になるかもしれませんね。


克己  2004-11-24 23:29:47  No: 55301

透過したいWindowにレイヤード属性を付加すれば、その下の領域をBitBltできます
この質問の場合、自分自身のWindowをクリエイトするときにレイヤード属性を付加すれば実現できます


PineSeed  2004-11-25 19:42:32  No: 55302

おおっ!!
知りませんでした。
確かにLayered属性をつけるとウインドウが移動したときに
再描画が発生しないのですね。
うそを書いてしまいました。申し訳ありません。

#透過機能ばかり注目されているようですが、
#こんなメリットがあるとは...


PineSeed  2004-11-25 20:42:54  No: 55303

デスクトップDCからBitBltのテストもしてみました。

テスト環境 Windows2000SP4、VC++6.0

確かに自分自身は表示されませんでした。
ただ、他のLayered属性がついているウインドウも非表示になるので、
それぞれのウインドウからイメージを取得して
重ね合わせの処理が必要になるでしょう。

また、克己さんが他のスレッド「オーバーレイをハードコピーするには?」
で質問されているように、オーバレイ処理されているものは
BitBltでは取得できないとおもいます。


KuroE−S  2004-12-12 22:22:23  No: 55304

色々模索していたらUpdateLayeredWindow関数を
見つけまして、それを使うことにしました。
みなさんの助言、助力感謝しております。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加