Ik ben een applicatie aan het maken waarin ik een stuk van een afbeelding wil selecteren. Dit wil ik doen dmv. een rubberband rectangle; je kent het wel: je klikt met de linkermuisknop op die afbeelding en naar mate je je muis beweegt, vergroot of verkleint de rectangle zich, tot wanneer je de muis los laat.
Nu heb ik even rondgekeken en wat uitgeprobeerd, en ik heb ondertussen 2 mogelijke 'technieken' gevonden.
In het eerste geval maak ik gebruik van de ControlPaint.DrawReversibleLine static method om een 'reversible rectangle' te tekenen op m'n image.
Die functie ziet er zo uit:
Dit is redelijk eenvoudig, je moet er gewoon altijd voor zorgen dat, als je al een rectangle hebt, je die rectangle eerst opnieuw tekent met dezelfde coördinaten, zodanig dat hij uitgewist wordt. Daarna roep je die method opnieuw aan met de nieuwe waardes.
Er is echter één probleem met deze methodiek. Zoals je kunt zien, wil ik dat de rectangle een rode kleur heeft. Echter, dat is niet altijd het geval zoals je hieronder kunt zien:

Zoals je ziet, heeft de rectangle ook blauwachtige lijnen.
Nu vermoed ik dat dat te maken heeft met de achtergrondskleur waarop die lijn getekend wordt.
Nu is de vraag natuurlijk hoe ik er hier kan voor zorgen dat die rectangle volledig rood is?
Een andere techniek die ik net ff bekeken heb, gaat de DrawLine method gebruiken van een Graphics object, en als de lijn 'uitgewist' moet worden, dan wordt er blijkbaar een andere Brush (TextureBrush) gebruikt, die als parameter in de constructor de originele image meekrijgt.
Nu, veel informatie over die TextureBrush vind ik niet in de .NET help, maar ik ga er dan maar vanuit dat die brush ervoor zorgt dat de net getekende lijn 'overschreven' wordt.
Zijn er hier misschien mensen die ervaring hebben met het maken van een dergelijke 'selection-rectangle'? Zoja, hoe hebben jullie het aangepakt? Welke van de 2 hierboven beschreven (of nog andere) technieken heeft de voorkeur ?
Nu heb ik even rondgekeken en wat uitgeprobeerd, en ik heb ondertussen 2 mogelijke 'technieken' gevonden.
In het eerste geval maak ik gebruik van de ControlPaint.DrawReversibleLine static method om een 'reversible rectangle' te tekenen op m'n image.
Die functie ziet er zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| public static void DrawReversibleRectangle ( Point startPoint, int toX, int toY, Control onControl )
{
ControlPaint.DrawReversibleLine ( onControl.PointToScreen (startPoint),
onControl.PointToScreen (new Point (toX, startPoint.Y)),
Color.Red ); // horizontale lijn van het startpunt
ControlPaint.DrawReversibleLine ( onControl.PointToScreen (startPoint),
onControl.PointToScreen (new Point (startPoint.X, toY)),
Color.Red ); // verticale lijn vanaf startpunt
ControlPaint.DrawReversibleLine ( onControl.PointToScreen (new Point (toX, startPoint.Y)),
onControl.PointToScreen (new Point (toX, toY)),
Color.Red );
ControlPaint.DrawReversibleLine ( onControl.PointToScreen (new Point (startPoint.X, toY)),
onControl.PointToScreen (new Point (toX, toY)),
Color.Red );
} |
Dit is redelijk eenvoudig, je moet er gewoon altijd voor zorgen dat, als je al een rectangle hebt, je die rectangle eerst opnieuw tekent met dezelfde coördinaten, zodanig dat hij uitgewist wordt. Daarna roep je die method opnieuw aan met de nieuwe waardes.
Er is echter één probleem met deze methodiek. Zoals je kunt zien, wil ik dat de rectangle een rode kleur heeft. Echter, dat is niet altijd het geval zoals je hieronder kunt zien:

Zoals je ziet, heeft de rectangle ook blauwachtige lijnen.
Nu is de vraag natuurlijk hoe ik er hier kan voor zorgen dat die rectangle volledig rood is?
Een andere techniek die ik net ff bekeken heb, gaat de DrawLine method gebruiken van een Graphics object, en als de lijn 'uitgewist' moet worden, dan wordt er blijkbaar een andere Brush (TextureBrush) gebruikt, die als parameter in de constructor de originele image meekrijgt.
Nu, veel informatie over die TextureBrush vind ik niet in de .NET help, maar ik ga er dan maar vanuit dat die brush ervoor zorgt dat de net getekende lijn 'overschreven' wordt.
Zijn er hier misschien mensen die ervaring hebben met het maken van een dergelijke 'selection-rectangle'? Zoja, hoe hebben jullie het aangepakt? Welke van de 2 hierboven beschreven (of nog andere) technieken heeft de voorkeur ?
https://fgheysels.github.io/