Xorモード指定字のCanvas描画の色指定

解決


Yama  2007-06-14 20:52:23  No: 26667  IP: 192.*.*.*

Canvasにラインを描く際、Xorを指定して背景を汚さずに書きたい場合の
色指定について教えてください。

    Pen.Color:=clBlue;
    Pen.Style:=psSolid;
    Pen.Mode :=pmXor;
    Pen.Width:=PenWidth;

上記のように指定すると、Xorで画面の背景色とclBlueの色の関係で
実際の色が変わってしまいます。  この場合、実際に描く色を
例えば、Blueにしたい場合は、色の指定をどのようにすると
よいのでしょうか。  よろしくお願いします。

編集 削除
アナタ次第  2007-06-14 21:33:48  No: 26668  IP: 192.*.*.*

>...Xorで画面の背景色とclBlueの色の関係で
>実際の色が変わってしまいます...

XORとは、そういうもの。どんな色を指定しても描かれる色は
背景色次第で変ってしまう。
逆にいえば背景色が分からなければ指定する色も分からない。

編集 削除
Yama  2007-06-14 23:00:22  No: 26669  IP: 192.*.*.*

背景色は、自作アプリなので当然わかっています。
わかっている背景色と描きたい色との関係性というか
指定方法を知りたいと思いました。

例えば、背景色が、clLtGrayで、CanvasにclBlueで
Canvasに描きたい場合は、Pen.Colorにこの2色から
計算して指定方法がありそうに思います。

編集 削除
ウォレス  2007-06-15 08:37:10  No: 26670  IP: 192.*.*.*

「描きたい色S」と「背景色B」とのxorをとったものが「求める色X」になります。

S^B=X  のとき
X^B=S  となります。

・・余計分かりにくいですね。
要するにある数Sにある数Bをxorしたとして、その数Xにもう一度BをxorするとSに戻ります。

しかし、質問とはずれちゃいますが、何故xorを使うのか不明です。
ソリッドに好きな色を使って描けばよいのではないですか?

編集 削除
TS  2007-06-15 08:47:08  No: 26671  IP: 192.*.*.*

あやふやで済みませんが
Xorは線消去用に使用していたと思いますが。

1  線を普通に引く
2  その同じ色でXorで線を引く

これで1の線が消去される

編集 削除
蛇に青い足を描く  2007-06-15 09:20:26  No: 26672  IP: 192.*.*.*

答えは既に出ているが...
Pen.Color := Brush.Color xor clBlue;

編集 削除
ウォレス  2007-06-15 09:56:24  No: 26673  IP: 192.*.*.*

プログラムする以前に、
恐らく発言者自身が矛盾に気づいていないものと思われます。

1.clBlueで線を描きたい。
2.線の上に背景の「感じ」を残したい。

この2つは相反しています。
どちらかの制約をなくす、若しくは緩めなければなりません。

発言者の意図を汲むなら、1.の制限を緩めるべきですが、どのように緩めるのかは発言者自身しか規定できません。

編集 削除
3K  2007-06-15 11:32:01  No: 26674  IP: 192.*.*.*

Canvas上にマウス移動にともなってLineを引きたい時にPen.Mode :=pmXorを
使用せざるおえなくて、私も前に苦戦した覚えが。
>>Pen.Color := Brush.Color xor clBlue;
おお、こんなに簡単な方法があったとは。感謝。

編集 削除
えーと  2007-06-15 14:01:49  No: 26675  IP: 192.*.*.*

>>Pen.Color := Brush.Color xor clBlue;

しかし、質問者もそうですが、背景色が予め分かっているなら Xor モードを
使う意味なんかまったく無いですね。たんに青い線を引いて、消すときは背景色
で上書きするだけですから。

Xor モードは背景色が一様でないときに威力を発揮するんでは?

編集 削除
Yama  2007-06-15 15:53:07  No: 26676  IP: 192.*.*.*

みなさん、情報ありがとうございます。

Pen.Color := Brush.Color xor clBlue;

これでドンピシャリでした。Bit演算で確認でもと思いましたが、
楽をして質問しました。

蛇足ですが、

>しかし、質問者もそうですが、背景色が予め分かっているなら
> Xor モードを使う意味なんかまったく無いですね。
>たんに青い線を引いて、消すときは背景色で上書きするだけですから。

これはうまくいきません。  画面には背景の上にいろいろな図面などが
あると、NGです。  Xorの出番なのです。

解決しました。  感謝です。

編集 削除
Yama  2007-06-15 16:00:33  No: 26677  IP: 192.*.*.*

解決ボタン忘れ

編集 削除