2011-12-14 14 views
4

画像に(PictureBoxを介して)画像を表示し、その画像上の矩形領域を選択できるwinformsアプリケーション(Framework v4)があります。画像選択の間および後に、選択された領域の境界線が示されます。これは現在、DrawRectangleコールを介して行われています。winformsアプリケーションに反対の(逆の)色を使用した描画

問題はこの矩形の色を選択する方法です。選択した色にかかわらず、常に背景(画像)にブレンドされる可能性があります。マイクロソフトのペイントは、「選択矩形」上で色を動的に反転させることで、これをうまく処理します。これはアプリケーションに非常に適していますが、私はwinformsでどのように行うのか分かりません。

2色を使用できるダッシュスタイルがあるかどうかを見て回ったので(背景色が何であっても白と黒を指定できるようになりましたが)この種のものは何も見つかりませんでした。

ご協力いただきありがとうございます。

+1

は、背景画像を見て、あなたが使用する必要があります色を決定します。彼らの反対の色が自分自身であるいくつかの色があることに注意してください。私はアイデアのためにPaint.NETのオープンソースプロジェクトを見ていきます。これはWinFormsとは関係がありません。本当の解決策はあなた自身の能力を伸ばすことです。デフォルトの方法はあなたが望むものを達成できません。 –

+0

@Ramhound:ソリューションはWinformsで実装する必要があるため、ソリューションには何か関係があります。バックグラウンドイメージを見ても、winformsの描画関数でこの情報をAPIでどのように利用するかはわかりません。私はPaint.Netのライセンスも調べました。それは派生的な作品を作ることを許さないので、ソースコードを見て「インスピレーションを得て」いるのが良いかどうかはわかりません。 PS:それ自身のように色が逆であることについてのヒントをありがとう。私は解決策に取り組んでいる間にそれを検討します。 – alokoko

答えて

2

あなたはここに

ControlPaint.FillReversibleRectangleMSDN

ControlPaint.DrawReversibleFrameMSDN

可逆長方形/フレームをペイントするControlPaintメソッドを使用することができます

private void DrawReversibleRectangle(int x, int y) { 
    // Hide the previous rectangle by calling the methods with the same parameters. 
    var rect = GetSelectionRectangle(this.PointToScreen(this.reversibleRectStartPoint), this.PointToScreen(this.reversibleRectEndPoint)); 
    ControlPaint.FillReversibleRectangle(rect, Color.Black); 
    ControlPaint.DrawReversibleFrame(rect, Color.Black, FrameStyle.Dashed); 
    this.reversibleRectEndPoint = new Point(x, y); 
    // Draw the new rectangle by calling 
    rect = GetSelectionRectangle(this.PointToScreen(this.reversibleRectStartPoint), this.PointToScreen(this.reversibleRectEndPoint)); 
    ControlPaint.FillReversibleRectangle(rect, Color.Black); 
    ControlPaint.DrawReversibleFrame(rect, Color.Black, FrameStyle.Dashed); 
} 
少し擬似コード方式の一例です
+1

ありがとう、私は 'DrawReversibleFrame'について知らなかった。私は長方形を描くことができたが、それは消える。私は 'PictureBox'の' Paint'メソッドで図面をやっています。これは間違っていますか? – alokoko

+0

マウスの移動イベントでDrawReversibleRectangleメソッドを呼び出そうとしました。 – punker76

0

代替の解決方法は、黒と白の2色で破線を描画して、どの背景にも表示されるようにすることです。

実線を1つの色(たとえば黒)で描画し、次に破線をもう1つの色(たとえば白)で描画します。

アイデアやコード:あなたはMicrosoftペイントがする正確に何だろうhttp://csharphelper.com/blog/2012/09/draw-two-colored-dashed-lines-that-are-visible-on-any-background-in-c/

using (Pen pen1 = new Pen(Color.Black, 2)) 
{ 
    e.Graphics.DrawRectangle(pen1, rect); 
} 
using (Pen pen2 = new Pen(Color.White, 2)) 
{ 
    pen2.DashPattern = new float[] { 5, 5 }; 
    e.Graphics.DrawRectangle(pen2, rect); 
} 
関連する問題