お世話になっています。
環境はWinXP VC++6.0 MFCです。
ダイアログに背景としてビットマップを設定し、その上にコントロールを並べたプログ
ラムを作っています。そのコントロールにOnMouseMoveイベントごとに座標点を取得し表
示するためのスタティックテキストコントロールを置き、その背景部分を透過させよう
と試みています。
OnCtlColorでSetBkMode(TRANSPARENT)とし実行すると、背景色の透過はされているよう
なのですが、テキストが更新の度に元のテキストの上から塗りつぶされてしまい上手く
表示されませんでした。
そこで、スタティックテキストコントロールに重なっている背景部分を再描画し、その
上で更新されたスタティックテキストの描画をしてみたのですが、今度はテキストがち
らついたり、一瞬だけ表示されて消えてしまったり、ダイアログ上でマウスクリックす
ると非表示になってしまったりと問題が絶えません。
過去にもいくつか似たような質問があったみたいなのですが、期待する回答の出ている
ものが見つからず、質問させていただきました。
何かいい方法を教えていただけないでしょうか。
本来コントロールは自分の内部の描画は自分で行うのが決まりです。
従って透過属性を設定した時点で、親の再描画が発生しないかぎり、
自分の再描画を行ってはいけないルールを選んだことになります。
つまり、ご要望の仕様にはスタティックコントロールは、まったく向かない
ので、大変な遠回りであるといえるのです。
現在は透明なウインドウが作れますのでそれを使う手もありますが、
これも相当な遠回りであり、賢い選択ではありません。
最も簡単に行う方法は素直にWM_PAINT時に矩形内に描画を
行うことです。使用するのはTextOut()やDrawText()です。
WM_MOUSEMOVEでの更新時には対象描画矩形をInvalidateRect();
UpdateWindow()してやればよいわけです。
これで再描画されるのは指定した矩形内だけですのできわめて高速に処理されます。
コントロールっぽい枠線をつけたければDrawEdge()で書いてください。
仲澤@失業者さん
大変丁寧にお答えいただき、ありがとうございます。
なるほど、値の変わるスタティックテキストの透過があまり薦められていないのにはそ
ういった理由があったのですね。
一度完成したプログラムへの変更だったので、できるだけ素の材料を残しておきたかっ
たのですが、説明していただいたことを踏まえて考えると今後のためにも少し手間をか
けた変更をしたほうが良さそうと判断できました。
一つテキストコントロールをDrawText()での描画に切り替えてみたところ上手くいって
いるようですので、残りのテキストコントロールもそちらの方法に替えていこうと思い
ます。
とてもわかりやすく為になる説明をいただき、本当にありがとうございました。