Markierungsrahmen

28/06/2009 - 13:53 von Josef Morlo | Report spam
Hallo zusammen,

ich brauche in einer Picturebox mit Bild einen in der Breite verànderbaren
Markierungsrahmen, in den dann ein Custom Control platziert werden soll.

Das habe ich zwar mit DrawReversibleFrame lösen können. Haken ist nur, dass
der Framestyle mit nur zwei Optionen (Thick und Dashed) sehr begrenzt ist.
Mir geht es aber um einen gepunkteten Rahmen, wie beispielsweise beim
FocusRectangle, um den Bearbeitungscharakter deutlicher hervorzuheben.

Habe dann versucht, das Problem über ein Label mit FocusRectangle zu lösen,
mit folgendem Code:

Private mLabel as Label
Private mStartpoint as Point
Private mMouseDown as Boolean

Private Sub Picturebox1_MouseDown _
(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles PictureBox1.MouseDown

mMouseDown = True
mStartpoint = New Point(e.X, e.Y)
End Sub


Private Sub PictureBox1_MouseMove _
(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles PictureBox1.MouseMove

If Not mMouseDown Then Return
If mLabel Is Nothing Then
mLabel = New Label
With mLabel
.BackColor = Color.Transparent
.Width = 1
.Height = 12
End With
Me.PictureBox1.Controls.Add(mLabel)
mLabel.Location = mStartpoint

Else
mLabel.Width = e.X - mStartpoint.X
ControlPaint.DrawFocusRectangle _
(Graphics.FromHwnd(mLabel.Handle), _
mLabel.ClientRectangle)
End If
End Sub


Private Sub PictureBox1_MouseUp _
(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles PictureBox1.MouseUp
mMouseDown = False
'Code Zum Entfernen von mLabel
'und Platzieren des CustomControl
End sub


Das funktioniert, aber es funktioniert nur dann, wenn der Benutzer bei
gedrückter Maustaste, 'in einem Zug', ohne innezuhalten, den Rahmen zieht.

Wie könnte ich erreichen, dass der Rahmen auch dann sichtbar bleibt, wenn
der Benutzer bei gedrückter Maustaste einen Moment pausiert.


Hoffe, ich hab mich halbwegs verstàndlich ausgedrückt.

Danke und Gruß

Josef Morlo
 

Lesen sie die antworten

#1 Karsten Sosna
04/07/2009 - 08:44 | Warnen spam
ich brauche in einer Picturebox mit Bild einen in der Breite verànderbaren
Markierungsrahmen, in den dann ein Custom Control platziert werden soll.

Das habe ich zwar mit DrawReversibleFrame lösen können. Haken ist nur,
dass
der Framestyle mit nur zwei Optionen (Thick und Dashed) sehr begrenzt ist.
Mir geht es aber um einen gepunkteten Rahmen, wie beispielsweise beim
FocusRectangle, um den Bearbeitungscharakter deutlicher hervorzuheben.

Habe dann versucht, das Problem über ein Label mit FocusRectangle zu
lösen,
mit folgendem Code:


Hallo Josef,
ich merke schon wieder, hier wird mal wieder "auf Teufel komm raus" mit
Controls gearbeitet. Bei grafischen Operationen ist das der der völlig
falsche Ansatz. Hier heißt es selber zeichnen und zwar nach allen Regeln der
Kunst, sonst endet das in einem Disaster.
Vorab solltest Du aber bedenken, das es ein Grauss ist ein reversive Farbe
zu ermitteln, den bei einfachen XOR-Operationen ergibt RGB(127, 127, 127),
RGB(128, 128, 128). Das ist fast das gleiche Grau. Hier ist es besser den
zuàndernen Farbwert in den HSL/ HSV-Farbraum zu überführen und den Farbwert
um bzw. 120° "zu drehen". Das funktioniert zwar auch nicht 100%ig ist aber
besser als eine einfache XOR-Operation auszuführen. Eine andere Möglichkeit
die auf jeden Fall immer funktioniert ist, den Farbwert ebenfalls in den
HSL/ HSV-Farbraum zu überführen. Anschließend entscheidet man anhand der
Helligkeit der Farbe ob ein schwarzer oder weißer Farbwert für den Rahmen
verwendet werden muss.
Das ganze ist dann in ein paar dutzend Codezeilen realisiert und
funktioniert bestens. Ich mache das immer so und habe nie
Performanceprobleme. Du musst halt alles selber programmieren, aber das
machen wir ja sowieso gerne. ;=)
Gruß Scotty

Ähnliche fragen