Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

User-Controls markieren

22 views
Skip to first unread message

heiko

unread,
Sep 20, 2006, 10:33:28 AM9/20/06
to
Hallo Gruppe,

ich programmiere gerade eine kliene Bilddatenbank und gebe die
Thumbnails der einzelnen Bilder in einem Panel aus. Für die Thumbnails
benutze ich Usercontrols die aus einer picturebox und drei labeln
bestehen. Funktioniert auch alles super bis hier.

Nun jetzt meine Frage: Gibt es ein Interface was die Usercontrols
implemtieren müssen um markierbar zu sein, oder muss ich das von hand
machen? Habe mal angefangen und das Klickevent auf dem Control
abgefangen und an das Mianwindow weitergeleitet. Dieses prüft jetzt, ob
das Control markiert werden darf und ob evtl. andere ihre Markierung
verlieren. Dann ruft es Markiere() auf dem Control auf, was sich dadurch
grau färbt. Funktioniert auch ganz gut, nur gibvt es eine
zeitverzögerung zwischen anklicken und einfärben. Ist aber zu verschmerzen.
Schwierig wird es allerdings wenn der User ein Auswahlrechteck mit der
Maus zihen will. Gibt es hierfür unterstützung seitens des Frameworks
oder muss ich das auch per Hand machen. Alos Mausaktion prüfen, Rechteck
zeichnen, prüfen welche Controls im Rechteck liegen usw...

LG, Heiko

heiko

unread,
Sep 22, 2006, 5:11:09 AM9/22/06
to
Hallo,

> Nun jetzt meine Frage: Gibt es ein Interface was die Usercontrols
> implemtieren müssen um markierbar zu sein, oder muss ich das von hand
> machen? Habe mal angefangen und das Klickevent auf dem Control
> abgefangen und an das Mianwindow weitergeleitet. Dieses prüft jetzt, ob
> das Control markiert werden darf und ob evtl. andere ihre Markierung
> verlieren. Dann ruft es Markiere() auf dem Control auf, was sich dadurch
> grau färbt. Funktioniert auch ganz gut, nur gibvt es eine
> zeitverzögerung zwischen anklicken und einfärben. Ist aber zu verschmerzen.
> Schwierig wird es allerdings wenn der User ein Auswahlrechteck mit der
> Maus zihen will. Gibt es hierfür unterstützung seitens des Frameworks
> oder muss ich das auch per Hand machen. Alos Mausaktion prüfen, Rechteck
> zeichnen, prüfen welche Controls im Rechteck liegen usw...

da diese Frage niemand beantworten kann, gehe ich davon aus alles von
Hand machen zu müssen. Ich habe damit bereits angefangen und bin jetzt
auf ein erstes Problem gestoßen. Wie kann ich ein gefülltes Rechteck
zeichnen, was alle anderen Controls überdeckt. Egal wo ich bisher
zeichne, liegen die Controls immer "oben" auf dem Rechteck.
Gibt es keine Funktion die ich überschreiben kann, in der das
gezeichnete Form schon gerendert ist und ich auf die gerenderte Grafik
zugreifen kann?

LG, Heiko

Frank Dzaebel

unread,
Sep 22, 2006, 11:56:03 AM9/22/06
to
Hallo heiko,

> Schwierig wird es allerdings wenn der User ein Auswahlrechteck mit der Maus

> zihen will. Gibt es hierfür unterstützung seitens des Frameworks ?

[ControlPaint.DrawFocusRectangle-Methode (Graphics, Rectangle) ]
http://msdn2.microsoft.com/de-de/library/k2czzc46.aspx


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

heiko

unread,
Sep 24, 2006, 7:17:06 AM9/24/06
to
Hallo,

>> Schwierig wird es allerdings wenn der User ein Auswahlrechteck mit der

>> Maus ziehen will. Gibt es hierfür unterstützung seitens des Frameworks ?


>
>
> [ControlPaint.DrawFocusRectangle-Methode (Graphics, Rectangle) ]
> http://msdn2.microsoft.com/de-de/library/k2czzc46.aspx

Langsam bin ich echt am verzweifeln und frage mich ob .net für so eine
ansich simple Anwendung überhaupt geeignet ist.

Ich habe bisher drei Möglichkeiten ausprobiert:

1. Ich zeichne in der onPaint() ein gefülltes Rechteck. Probleme: Alle
controls die ich markieren will liegen über dem Rechteck und nicht
darunter. Ausserdem flimmert es trotz double Buffer wirklich krass. Das
liegt daran, dass das zecihnen des rechteckes anscheinend länger dauert
als die Zeit in der das nächste MouseMove ein Refresh aufruft.

2. Ich zeichne mit ControlPaint.FillReversibleRectangle. Probleme: Hier
ist alles invertiert. MAg für markierte texte ok sein, für Grafiken
sieht es eher doof aus. Ausserdem flimmert es noch stärker als die 1.
Methode.

3. Ich zeichne mit ControlPaint.ReversibleRectangle. Probleme: Flimmern
ist hier mässig, allerdings sieht man währen des aufziehens das Rechteck
nicht, da das Refresh anscheinend um Faktoren länger braucht als das
Zeichnen des Rechteckes, so das ich gar nichts sehe, solange ich die
Maus bewege.

Wenn ich statt Refresh() vor dem Neuzeichnen invalidate(rectangle)
benutze, wird immer erst irgendwann neugezeichnet und ich sehe mehrere
Versionen meines Rechteckes auf dem Bildschirm.
Bei allen getesteten Varianten habe ich auf einem 3,8 GHz Pc eine
CPU-Auslastung von 100%. Wenn ich das gleiche im Windows Arbeitsplatz
mache (auch mit Thumbnails) habe ich eine einstellige CPU auslastung.

Gibt es keine Möglichkeit an das gerenderte Bild meines Fensters
ranzukommen und direkt darauf rumzuzeichnen und statt einem Refrsh()
eine Kopie wieder reinzukopieren?

Bin echt verzweifelt, dass so etwas simples in .net nicht funktioniert
und Bin kurz davor keine Controls mehr zu benutzen, sondern in onPaint
alles Thumbnails direkt auf die Arbeitsfläche zu zeichnen. Allerdings
würde ich mich dann fragen, wozu ich überhaupt .net benutzen sollte...

LG, Heiko

Frank Dzaebel

unread,
Sep 24, 2006, 9:33:59 AM9/24/06
to
Hallo heiko,

> Ausserdem flimmert es trotz double Buffer wirklich krass.

Es gibt unterschiedliche DoubleBuffer-Verfahren.
Du scheinst auch nur Probleme mit dem Flackern zu haben,
nicht aber mit der Funktion selber.

Dazu Möglichkeiten:

Nach "InitializeComponent();" folgendes einzufügen :
this.ResizeRedraw=true;
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.ResizeRedraw, true);
UpdateStyles();
Oder nur DoubleBuffer, checke das
in der Doku gegen. Siehe auch
"ControlStyles.Selectable", sodass CanFokus true wird.

[ControlStyles-Enumeration]
http://msdn2.microsoft.com/de-de/library/system.windows.forms.controlstyles.aspx

[Flicker free drawing using GDI+ and C#]
http://www.codeproject.com/cs/media/flickerFreeDrawing.asp

[Google Talk styled Windows Form]
http://web6.codeproject.com/cs/miscctrl/GoogleTalkWindowsForm.asp?df=100

[Customising the .NET Panel control]
http://www.codeproject.com/vb/net/custompanel.asp

[Don't Flicker! Double Buffer!]
http://www.codeproject.com/csharp/DoubleBuffering.asp

heiko

unread,
Sep 26, 2006, 11:40:45 AM9/26/06
to
Hallo,

>> Ausserdem flimmert es trotz double Buffer wirklich krass.
>
> Es gibt unterschiedliche DoubleBuffer-Verfahren.
> Du scheinst auch nur Probleme mit dem Flackern zu haben,
> nicht aber mit der Funktion selber.

Wie ich aber bereits oben schrieb, lässt sich das Problem durch double
Buffer nicht lösen. Vielmehr liegt es an der art von .net den Desktop zu
zeichnen. Ich werde das Projekt jetzt in c++ realisieren, da diese
Vorgabe unter .net nicht lösbar scheint.
Habe jetzt mal etwas mit gdi+ rumgespielt und bin ehrlich gesagt extrem
enttäuscht. Die Performance ist so dermaßen schlecht, dass mir miteinmal
sogar Grafik unter Java schnell vorkommen...

LG, Heiko

Frank Dzaebel

unread,
Sep 26, 2006, 1:41:16 PM9/26/06
to
Hallo heiko,

>>> Ausserdem flimmert es trotz double Buffer wirklich krass.
>>
>> Es gibt unterschiedliche DoubleBuffer-Verfahren.
>> Du scheinst auch nur Probleme mit dem Flackern zu haben,
>> nicht aber mit der Funktion selber.
>
> Wie ich aber bereits oben schrieb, lässt sich das Problem durch double Buffer
> nicht lösen.

Wie ich aber bereits schrieb, gibt es unterschiedliche
Verfahren zum DoubleBuffering nebst Einstellungen.
Bisher hat es hier noch jeder geschafft, solche Flacker-
Probleme in den Griff zu bekommen.
Schlimmstenfalls müsstest Du APIs bemühen.
Ich vermute einen simplen Programmierfehler/Verständnis-
fehler. Schon gar nicht mit derart simplen Sachen wie
DrawFocusRectangle.

0 new messages