Canvasにラインを描く際、Xorを指定して背景を汚さずに書きたい場合の
色指定について教えてください。
Pen.Color:=clBlue;
Pen.Style:=psSolid;
Pen.Mode :=pmXor;
Pen.Width:=PenWidth;
上記のように指定すると、Xorで画面の背景色とclBlueの色の関係で
実際の色が変わってしまいます。 この場合、実際に描く色を
例えば、Blueにしたい場合は、色の指定をどのようにすると
よいのでしょうか。 よろしくお願いします。
>...Xorで画面の背景色とclBlueの色の関係で
>実際の色が変わってしまいます...
XORとは、そういうもの。どんな色を指定しても描かれる色は
背景色次第で変ってしまう。
逆にいえば背景色が分からなければ指定する色も分からない。
背景色は、自作アプリなので当然わかっています。
わかっている背景色と描きたい色との関係性というか
指定方法を知りたいと思いました。
例えば、背景色が、clLtGrayで、CanvasにclBlueで
Canvasに描きたい場合は、Pen.Colorにこの2色から
計算して指定方法がありそうに思います。
「描きたい色S」と「背景色B」とのxorをとったものが「求める色X」になります。
S^B=X のとき
X^B=S となります。
・・余計分かりにくいですね。
要するにある数Sにある数Bをxorしたとして、その数Xにもう一度BをxorするとSに戻ります。
しかし、質問とはずれちゃいますが、何故xorを使うのか不明です。
ソリッドに好きな色を使って描けばよいのではないですか?
あやふやで済みませんが
Xorは線消去用に使用していたと思いますが。
1 線を普通に引く
2 その同じ色でXorで線を引く
これで1の線が消去される
答えは既に出ているが...
Pen.Color := Brush.Color xor clBlue;
プログラムする以前に、
恐らく発言者自身が矛盾に気づいていないものと思われます。
1.clBlueで線を描きたい。
2.線の上に背景の「感じ」を残したい。
この2つは相反しています。
どちらかの制約をなくす、若しくは緩めなければなりません。
発言者の意図を汲むなら、1.の制限を緩めるべきですが、どのように緩めるのかは発言者自身しか規定できません。
Canvas上にマウス移動にともなってLineを引きたい時にPen.Mode :=pmXorを
使用せざるおえなくて、私も前に苦戦した覚えが。
>>Pen.Color := Brush.Color xor clBlue;
おお、こんなに簡単な方法があったとは。感謝。
>>Pen.Color := Brush.Color xor clBlue;
しかし、質問者もそうですが、背景色が予め分かっているなら Xor モードを
使う意味なんかまったく無いですね。たんに青い線を引いて、消すときは背景色
で上書きするだけですから。
Xor モードは背景色が一様でないときに威力を発揮するんでは?
みなさん、情報ありがとうございます。
Pen.Color := Brush.Color xor clBlue;
これでドンピシャリでした。Bit演算で確認でもと思いましたが、
楽をして質問しました。
蛇足ですが、
>しかし、質問者もそうですが、背景色が予め分かっているなら
> Xor モードを使う意味なんかまったく無いですね。
>たんに青い線を引いて、消すときは背景色で上書きするだけですから。
これはうまくいきません。 画面には背景の上にいろいろな図面などが
あると、NGです。 Xorの出番なのです。
解決しました。 感謝です。
解決ボタン忘れ
ツイート | ![]() |