- - PR -
ダブルバッファを使用しているコントロールで背景を透過させるには
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-09-11 12:25
お世話になります。
2つのコントロールA,BがありB.parent = Aの場合 Bの背景を透過させる方法について質問です。 A,Bともにダブルバッファーを用いており、 描画イメージはbmpA,bmpBとして保持しています。 現在、コントロールBの描画(Paintイベント)に bmpAの一部を切り抜いて背景として使用し、 その後、bmpBを描画していますが、 コントロールBをマウスで移動すると(そのようにプログラムしました。) 前回描画した背景を保持したまま一旦移動し、 再描画されるため、見た感じ違和感があります。 この現象はコントロールのサイズが大きくなると酷くなります。 違和感なくスムーズに描画する方法はないでしょうか? 処理速度の問題だと思いますが、別の方法があればご教授下さい。 宜しくお願いします。 | ||||||||||||||||
|
投稿日時: 2007-09-11 15:31
移動時にもそれをやればできるんでしょうけど、途轍もなく遅くなりそうですね。 レイヤードウィンドウを使いたいところですが、アレはトップレベルウィンドウにしか使えないので、移動する時だけトップレベルウィンドウにすりかえてそれをレイヤードウィンドウにし、移動が終われば子コントロールに戻すとかが単純そうですが…。 _________________ 囚人のジレンマな日々 | ||||||||||||||||
|
投稿日時: 2007-09-11 16:37
それは大変そうです… 下のコントロールの一部を切り抜いて使っているところがそもそも問題なので、 とりあえず、Regionで要らない部分を切ったらどうでしょう? 私のところでは今の所うまくいってますが。 [ メッセージ編集済み 編集者: れい 編集日時 2007-09-11 16:39 ] | ||||||||||||||||
|
投稿日時: 2007-09-11 17:09
そうでもないと思うんですけどね。 エクスプローラのアイコンのドラッグ中みたいなイメージだったんですけど、アレも SysDragImage(名前は少し違うかも)という名前のウィンドウクラスのウィンドウを作って実現しているので、ドラッグ中のアイコンはレイヤードウィンドウじゃないかなと思います。 手順としては 1.コントロールBの移動を検知 2.コントロールBを消して、マウスキャプチャ開始(ユーザーが動かすんじゃないのかな?) 3.レイヤードウィンドウ作成 4.移動開始 5.移動終了 6.終了時の位置にコントロールB表示。 みたいな。 _________________ 囚人のジレンマな日々 | ||||||||||||||||
|
投稿日時: 2007-09-11 18:12
囚人さん。れいさん。ご回答ありがとうございます。
お二方の方法でそれぞれ調べてみましたが、 レイヤードウィンドウを使う方法に関しては、APIでしか(.netではなく)実現できそうもなく さらにWindows2000以降でないとサポートしていないようですので 他の方法で実現できなかったらチャレンジしてみます。 技術的には大変貴重な意見で、大変勉強になりました。ありがとうございます。 リージョンを使用する方法ですが、プログラムの背景描画の箇所をコメント化し、 リージョンを設定してやることで違和感なく移動することが可能になりました。 ただ、コントロールB(bmpB)には、実は文字を描画していて文字以外を切り抜くと それまで矩形(外枠を点線で囲んでました)だったので マウスでの移動のしやすさと、移動が可能であるという認識のしやすさが 失われてしまい、これをどう解決するかという問題点が浮上しました。 とりあえず、とても気になっていた移動時の違和感がなくなりホットしてます。 貴重なご回答をありがとうございました。 | ||||||||||||||||
|
投稿日時: 2007-09-11 19:36
うーん 矩形で囲まれた文字を移動したいだけなわけですね? それならコントロールBを作らずに、 コントロールAに全部実装するほうが楽だし軽いと思いますよ。 | ||||||||||||||||
|
投稿日時: 2007-09-13 09:30
れいさん。ご回答ありがとうございます。
実はコントロールBをダブルクリックした段階で、コントロールA(bmpA)に bmpBが合成されるという仕様のため、初めからコントロールAに描画するのは さけたいです。 市販されているグラフィックソフトでは、文字を点線で囲んでさらにその点線を アニメーション化(@)し、移動も文字列をクリックしドラッグ(A)。というものもありました。
という点では、Aが現状と同じ動作ですし、拡大もできる仕様なのでよしとします。
という点では、@は簡単には実装できそうもないので、 とりあえず、コントロールの外枠を点線で囲んで見た目は 以前と変わらないようにしようと思います。 @に関してどこか参考になるサイトとかありましたらご紹介下さい。 宜しくお願いします。 | ||||||||||||||||
|
投稿日時: 2007-09-13 10:47
私ならそれでもコントロールAに全部実装します。 もちろんクラスは分けますが。
この部分がいろいろ解釈できるのでよくわかりませんが、 あんまり複雑なリージョンを設定すると重くなり、利点が失われます。
これも何をしたいのか私にはよくわかりませんが。 タイマーとかで普通に描いても、 アニメーションgifでもいいのではないですか? |