DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DrawMode = vbInvert機能

環境/言語:[Windows2000,VB.NET]
分類:[.NET]

VB6での DrawMode = vbInvert での反転描画はVB.NETでは
どうやって行うのでしょうか、教えて下さい。
こんばんは〜
VB6は、あまり詳しくなくて・・・
vbInvertって色の反転のことですよね?
それですと↓に詳しくのってます。(わたし使ったことなくて説明できません
http://dobon.net/vb/dotnet/graphics/drawnegativeimage.html
画像イメージの反転ではなく線や文字の描画で反転描画をさせたいのです。
どなたかご存知の方よろしくお願いします。
失礼しました。
反転描画でしたら、こちらに載っています。
http://dobon.net/vb/dotnet/graphics/rotateflip.html
テラオメガさん何度もありがとうございます。
座標の反転ではなく色の反転描画です。
いろいろ調べていますが未だ解りませんので宜しくお願いします。

ForeColor = vbBlack
'黒で線描画
DrawMode = vbCopyPen
Line (0, 0)-(1000, 1000)
'反転して白に
DrawMode = vbInvert
Line (0, 0)-(1000, 1000)
  '更に反転して元の色に戻す
DrawMode = vbInvert
Line (0, 0)-(1000, 1000)
■No4865に返信(NINEさんの記事)

 NINEさん、テラオメガさん、こんばんは。横槍失礼します。

 私も DrawMode = vbInvert を使ったことがないので的外れかも知れませんけども
> 座標の反転ではなく色の反転描画です。
ということでしたら、 RGB 値を自分で計算すれば事足りるのではないでしょうか?
 先の例に合わせるとこんな感じで。
# 直打ちしてるのでスペルミスがあるかも知れません。

    Dim g As Graphics = CreateGraphics()
    Dim c As Color = Color.Black
    '黒で描画
    g.DrawLine(New Pen(c), 0, 0, 1000, 1000)
    '反転して白に
    c = Color.FromArgb(c.ToArgb() Xor &HFFFFFF)
    g.DrawLine(New Pen(c), 0, 0, 1000, 1000)
    '更に反転して元の色に戻す
    c = Color.FromArgb(c.ToArgb() Xor &HFFFFFF)
    g.DrawLine(New Pen(c), 0, 0, 1000, 1000)
深山さんありがとうございます。
私の例が手抜きで詳しく書いていなかったせいで
意図が伝わらなかったようで申し訳ありません。
最初の黒で書いている線は実際は色んな色が混ざっていて
判別できない状態と考えて下さい。
例えるとペイントで適当にお絵かきした画像で範囲選択
を行った際に出る範囲の線をやりたいのです。
vb6の際は例で書いていたやり方で出来ていたので同様なやり
方がないかと模索している所です。
.net frameworkは難しい・・・
■No4869に返信(NINEさんの記事)

 NINEさん、こんにちは。深山です。

> 私の例が手抜きで詳しく書いていなかったせいで
> 意図が伝わらなかったようで申し訳ありません。
> 最初の黒で書いている線は実際は色んな色が混ざっていて
> 判別できない状態と考えて下さい。
> 例えるとペイントで適当にお絵かきした画像で範囲選択
> を行った際に出る範囲の線をやりたいのです。

 ??? すいません、やっぱりよく解りませんでした(^_^;)

 そこで VB6 で以下のようなコードを試したところ、ようやく意図してることが解りました。
背景色をそのまま反転させられるのですね!

    Dim i As Integer
    For i = 0 To 255
        Line (0, i * 8)-Step(8 * 256, 8), RGB(i, i, i), BF
    Next
    DrawMode = vbInvert
    Line (0, 0)-(8 * 256, 8 * 256)


 どうなれば良いかはなんとなく解ったものの、 .NET ではどうすれば良いのか解らなかったので
vbInvert をキーワードにぐぐってみました。すると次のようなやり取りが。
http://www.dotnet247.com/247reference/msgs/39/198908.aspx

 どうやら ControlPaint クラスの DrawReversibleLine メソッドを使えば同様のことが出来そうです。
試してみたところ、 VB6 で行ったのと同じ結果を得られました。
# 使用する際にはスクリーン座標への変換が必要になります。

 NINEさんが実際にどのような処理をするのか解りませんので、用をなすかどうか定かでは
ありませんけども、これでどうでしょうか?
 DrawReversibleFrame メソッドや FillReversibleRectangle メソッドといったものも
ありますし、応用は利くと思うのですが‥‥。


 処理内容次第では、こちらの方が参考になるかも知れません。
http://www.vb-helper.com/howto_net_rubberband_line.html
深山さん、ありがとうございます。
1番目の方法が求めていた方法でした。
2番目は求めている物ではありませんでしたが非常に参考になりました。
やはり英語は避けて通れませんね・・・
ここのTipsにも書いてありました、灯台元暗しでした。
http://dobon.net/vb/dotnet/graphics/drawcontrols.html
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板