Teechart上に十字線や横線(続)


yTake  2016-04-14 05:07:23  No: 48163

yTakeです。
MADさん、解決済みのところありがとうございました。
確かに、参照先が間違っていました。

ところで、"pmXor"の件ですが、今一つ使い方が分かりません。

はじめ、描画に"pmCopy"、消去に"pmXor"を使うと思い。
ボタン1:
Chart1.Canvas.Pen.Mode := pmXcopy;
Chart1.Canvas.Pen.Color := clRed;
Chart1.Canvas.DoHorizonLine( x1, x2, y );
と、
ボタン2:
Chart1.Canvas.Pen.Mode := pmXor;
Chart1.Canvas.Pen.Color := clRed;
Chart1.Canvas.DoHorizonLine( x1, x2, y );
にわけてボタンへ割り当てました。ボタン1とボタン2を交互にクリックすると
結果、水平線は消えません。

その内、ボタン2のみを繰り返してクリックするだけで、水平線の表示非表示を繰り返します。
とりあえず、希望の動作ではありますが、困った点があります。
水平線の色が赤ではありません。水色になります。
ボタン1のみをクリックすると正しく赤い水平線が表示っされます。
xorの取り方が悪いのでしょう。

赤い水平線を引いておいて(ボタン1)から、penModeをxorに設定してから赤い水平線を引いて(ボタン2)も、赤い水平線は消えません。

xor(排他的論理和)で線を消すとはどういう事でしょう?
web上でサンプルが見つかりましたが、なぜかxorでも線は消えていませんでした。

よろしくお願いします。


MAD  URL  2016-04-14 05:58:24  No: 48164

ボタン1もpmXorにしてみてください。


MAD  URL  2016-04-14 06:05:28  No: 48165

あ、ボタン2だけはやってみたのですね。
xorの意味を調べてみればわかると思いますが、
背景の色と指定した色をビット単位でxorした値で描画されます。
背景色が$FFFFFFで描画色が$FF0000なら実際に描かれる色は$00FFFFになります。
もう一度描画すると元の色に戻ります。

参考:
https://www.petitmonte.com/bbs/answers?question_id=4880


yTake  2016-04-14 19:40:11  No: 48166

MADさん
ありがとうございました。

指定色と背景色のxor結果が描画されるわけですね。
考えてみれば当然の事ですが、指定色が描かれるものとの思い込みが強すぎました。
指定すべき色もxorの結果が指定色になればよいわけですね。

ただ、そうすると描画すべき座標の現在の描画色を知る必要がありますが、
”参考”でご案内頂けたページでは、Canvas.Brush.Colorとのxorを取っている様ですが、何となく違和感があります。
Canvas.BackColorと言うのもありました。

Chart上には背景色の他、軸の補助線や、データプロット等が重なっています。
何か”CurrentPosColor”的なものが必要な気もします。

ただ、"Brush.Color", "BackColor"のいずれでも、指定色での表示非表示はうまくできている様子です。


tor  2016-04-14 20:42:27  No: 48167

物は適材適所なので、期待通りの結果を得るのが難しければ無理にその手法にこだわることもないんじゃないですか?
特にこの手法には「線が存在する間、下の図形が変化してはいけない」という前提があるので、今回の例には向いていない気がします。

リマメでの描画が向いているのは、本来の描画サイクル以外のところで素早くフィードバックを返したい場合です。
例えばマウスを使って範囲指定する時に四角い枠が出てきますよね?
(ラバーバンドと言います)
あれを描画するのに、マウスが動くたびいちいち無効化して再描画しては効率が悪いしちらつきも出てしまうので、反転描画を利用しているわけです。
この場合「背景によっては線が変な色になるけど、それよりもパフォーマンス重視」
「マウスドラッグしている間、下の内容は変化するわけないので大丈夫」という条件があるのでこれが成り立っているわけですね。
スススススススススススススススススススススススススススススススススススススススス
ニコ yヤ
トコ イーアカッーエッアエィ木ゥ イーコエエコオク  書込者ノト:ロ 」。ァ ン

さん
ありがとうございます。
確かにおっしゃられる通りです。

また、必ずしも背景と完璧なリマメを取る必要性はないので、これでも良いのかなと思います。

なお、水平線をとして描画する手法は表示非表示も直ぐに実現できました。

いずれの手法でも目的は果たすことが出来ていますので、取り敢えず、閉めさせて頂きます。

ありがとうございました。
スススススススススススススススススススススススススススススススススススススススス
ニコ yヤ
トコ イーアカッーエッアエィ木ゥ イーコエオコオカ  書込者ノト:ロ 」。ァ ン
モコ 

チェック忘れでした。


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

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






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