- PR -

ダブルバッファを使用しているコントロールで背景を透過させるには

投稿者投稿内容
Hidering
常連さん
会議室デビュー日: 2007/05/22
投稿数: 33
投稿日時: 2007-09-11 12:25
お世話になります。
2つのコントロールA,BがありB.parent = Aの場合
Bの背景を透過させる方法について質問です。

A,Bともにダブルバッファーを用いており、
描画イメージはbmpA,bmpBとして保持しています。

現在、コントロールBの描画(Paintイベント)に
bmpAの一部を切り抜いて背景として使用し、
その後、bmpBを描画していますが、
コントロールBをマウスで移動すると(そのようにプログラムしました。)
前回描画した背景を保持したまま一旦移動し、
再描画されるため、見た感じ違和感があります。
この現象はコントロールのサイズが大きくなると酷くなります。

違和感なくスムーズに描画する方法はないでしょうか?
処理速度の問題だと思いますが、別の方法があればご教授下さい。

宜しくお願いします。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-09-11 15:31
引用:

現在、コントロールBの描画(Paintイベント)に
bmpAの一部を切り抜いて背景として使用し、
その後、bmpBを描画していますが、


移動時にもそれをやればできるんでしょうけど、途轍もなく遅くなりそうですね。

レイヤードウィンドウを使いたいところですが、アレはトップレベルウィンドウにしか使えないので、移動する時だけトップレベルウィンドウにすりかえてそれをレイヤードウィンドウにし、移動が終われば子コントロールに戻すとかが単純そうですが…。

_________________
囚人のジレンマな日々
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-09-11 16:37
引用:

囚人さんの書き込み (2007-09-11 15:31) より:
レイヤードウィンドウを使いたいところですが、アレはトップレベルウィンドウにしか使えないので、移動する時だけトップレベルウィンドウにすりかえてそれをレイヤードウィンドウにし、移動が終われば子コントロールに戻すとかが単純そうですが…。



それは大変そうです…

下のコントロールの一部を切り抜いて使っているところがそもそも問題なので、
とりあえず、Regionで要らない部分を切ったらどうでしょう?

私のところでは今の所うまくいってますが。

[ メッセージ編集済み 編集者: れい 編集日時 2007-09-11 16:39 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-09-11 17:09
引用:

それは大変そうです…



そうでもないと思うんですけどね。

エクスプローラのアイコンのドラッグ中みたいなイメージだったんですけど、アレも SysDragImage(名前は少し違うかも)という名前のウィンドウクラスのウィンドウを作って実現しているので、ドラッグ中のアイコンはレイヤードウィンドウじゃないかなと思います。

手順としては

1.コントロールBの移動を検知
2.コントロールBを消して、マウスキャプチャ開始(ユーザーが動かすんじゃないのかな?)
3.レイヤードウィンドウ作成
4.移動開始
5.移動終了
6.終了時の位置にコントロールB表示。

みたいな。
_________________
囚人のジレンマな日々
Hidering
常連さん
会議室デビュー日: 2007/05/22
投稿数: 33
投稿日時: 2007-09-11 18:12
囚人さん。れいさん。ご回答ありがとうございます。

お二方の方法でそれぞれ調べてみましたが、
レイヤードウィンドウを使う方法に関しては、APIでしか(.netではなく)実現できそうもなく
さらにWindows2000以降でないとサポートしていないようですので
他の方法で実現できなかったらチャレンジしてみます。
技術的には大変貴重な意見で、大変勉強になりました。ありがとうございます。

リージョンを使用する方法ですが、プログラムの背景描画の箇所をコメント化し、
リージョンを設定してやることで違和感なく移動することが可能になりました。
ただ、コントロールB(bmpB)には、実は文字を描画していて文字以外を切り抜くと
それまで矩形(外枠を点線で囲んでました)だったので
マウスでの移動のしやすさと、移動が可能であるという認識のしやすさが
失われてしまい、これをどう解決するかという問題点が浮上しました。

とりあえず、とても気になっていた移動時の違和感がなくなりホットしてます。
貴重なご回答をありがとうございました。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-09-11 19:36
引用:

マウスでの移動のしやすさと、移動が可能であるという認識のしやすさが
失われてしまい、これをどう解決するかという問題点が浮上しました。



うーん
矩形で囲まれた文字を移動したいだけなわけですね?

それならコントロールBを作らずに、
コントロールAに全部実装するほうが楽だし軽いと思いますよ。
Hidering
常連さん
会議室デビュー日: 2007/05/22
投稿数: 33
投稿日時: 2007-09-13 09:30
れいさん。ご回答ありがとうございます。

引用:
コントロールAに全部実装するほうが



実はコントロールBをダブルクリックした段階で、コントロールA(bmpA)に
bmpBが合成されるという仕様のため、初めからコントロールAに描画するのは
さけたいです。
市販されているグラフィックソフトでは、文字を点線で囲んでさらにその点線を
アニメーション化(@)し、移動も文字列をクリックしドラッグ(A)。というものもありました。
引用:
マウスでの移動のしやすさ


という点では、Aが現状と同じ動作ですし、拡大もできる仕様なのでよしとします。
引用:
移動が可能であるという認識のしやすさ


という点では、@は簡単には実装できそうもないので、
とりあえず、コントロールの外枠を点線で囲んで見た目は
以前と変わらないようにしようと思います。

@に関してどこか参考になるサイトとかありましたらご紹介下さい。
宜しくお願いします。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-09-13 10:47
引用:

Hideringさんの書き込み (2007-09-13 09:30) より:
引用:
コントロールAに全部実装するほうが


実はコントロールBをダブルクリックした段階で、コントロールA(bmpA)に
bmpBが合成されるという仕様のため、初めからコントロールAに描画するのは
さけたいです。



私ならそれでもコントロールAに全部実装します。
もちろんクラスは分けますが。

引用:

ただ、コントロールB(bmpB)には、実は文字を描画していて文字以外を切り抜くと
それまで矩形(外枠を点線で囲んでました)だったので
マウスでの移動のしやすさと、移動が可能であるという認識のしやすさが
失われてしまい、これをどう解決するかという問題点が浮上しました。



この部分がいろいろ解釈できるのでよくわかりませんが、
あんまり複雑なリージョンを設定すると重くなり、利点が失われます。

引用:

@に関してどこか参考になるサイトとかありましたらご紹介下さい。



これも何をしたいのか私にはよくわかりませんが。

タイマーとかで普通に描いても、
アニメーションgifでもいいのではないですか?

スキルアップ/キャリアアップ(JOB@IT)