スタティックテキストの背景の透過について

[戻る]
ぷく 2007/10/24(水) 18:33:31
VC初心者なもので、過去の似たような質問を見てもよくわからなかったので質問させて
下さい。

VC++.NET2003のMFCで、プログラムを作っています。

ピクチャーコントロールに描画し、その上にスタティックテキストを重ねて中に文字を
入れ、
スタティックテキストの背景を透過させることができたのですが、
ピクチャーボックスに描画したのが時間的に色がグラデーション変化させた動画のよう
なもののせいなのか、文字がちらついてしまいます。
このちらつきをなくすためにはどうすればよいのでしょうか?

よろしくお願い致します。

+ 2007/10/26(金) 13:48:54
ピクチャーコントロールに直接DrawTextすればいいじゃん。
そうすればそんなメンドクサイ事象に悩まされることなどないと思います。

ぷく 2007/10/30(火) 14:32:50
アドバイスありがとうございます。

そのようにすると色が変化するたびにちらつくのでほとんど文字が出てこなくなるので
す。
だからスタティックテキストを重ねたのですが・・・
他にも方法はあるのでしょうか??

+ 2007/10/30(火) 15:43:38
掲題の質問内容だけではわかりませんが。
@「動画のような」は、AVIとかの動画ですか?ビットマップとかDIBですか?何者です
か?
A「動画のような」ものは、ご自身のアプリで動画のように表示しているのか?
Bどのタイミングでピクチャーへ描画してるのか。

もう少し情報いただけないとなんとも。(ソースコードはまだ要りませんw)
#チラつくというのも具体性が微妙な気がします。

+ 2007/10/30(火) 15:51:58
あと、「ほとんど見えない」もどのように見えないのか?
隠れて見えないのか?明度が同じで見えないのか?色彩が同じで見えないのか?

抽象的な質問はレス付かない原因です。

ぷく 2007/10/30(火) 16:30:56
何度もありがとうございます。

動画というより、同じ描画(四角を単色で塗りつぶすもの)で、
色だけを色相環で1度ずつまわしているものを
forループで色相環360度分、ピクチャーコントロールに描画させています。
グラデーションはsleepを使って徐々に色を変化させるようにしています。

>あと、「ほとんど見えない」もどのように見えないのか?
>隠れて見えないのか?明度が同じで見えないのか?色彩が同じで見えないのか?

文字の色は固定しているので、色の都合で見えなくなるというわけではありません。
色相を1度ずらすfor文内に(色)描画プログラム+文字のプログラムを書いているので、
描画→文字→描画→文字→・・・
のような感じで文字が現れたり消えたりするということです。
文字を読み取るのが困難な状態です。


スタティックテキストに文字を表示した場合は、原因不明ですが文字がほんの一瞬消え
てしまいます。
読めるが若干目障りという状態です。


拙い説明で申し訳ありません。。。

+ 2007/10/30(火) 16:58:58
なるほど。
GUIプログラムでsleepを使うには、細心の注意が必要です。(多くの場合問題ないよう
に見えますが)
あるメッセージを処理してる間にソレをいきなり中断され、別のメッセージを処理しだ
すからです。

また、スタティックテキストは子ウインドウなので(隠蔽されていますが)メッセージ
処理します。
スタティックの文字が消えるのは、スタティックが文字を再描画しようとしているのに
CPUを取られるからかと。


これだけでヒントになりますか?

菟ー 2007/10/31(水) 00:04:49
提示の仕様を自分がコーディングするとしたら、
次のように作ります。

1、ループは使わずタイマー。
2、タイマーハンドラ内では色相環のカウントUPとか、色値の決定処理だけ。
3、InvalidateRectなど、ウインドウを再描画「させる」←重要:
      能動的に描くのではなくWM_PAINTハンドラで受動的に描く。
4、WM_PAINTのハンドラ内で、現在の色相環のカウント値、色値で描画。文字も
DrawText。


一般的かどうかは不明ですが、だいたいこんな感じに書くんじゃないかな?

しま 2007/10/31(水) 15:04:10
塗り潰した後に文字を書くのでちらつくのだと思います
(塗り潰す広さによってはこれがちらつきの原因とは言えない事もあります)
こういう場合のちらつき対策は
 ビットマップを用意しておいて
 そこに更新結果を描画し、
 一気にビットマップを画面に転送する
 のが一般的です
オフスクリーンとか裏画面とか呼ぶ技法です

古いスレッドには追加発言できません。