Non Client Bereich neu Zeichnen.

Danielku15

Erfahrenes Mitglied
Hallo.
Ich zapfe im bei meinem Forrm das WM_NCPAINT Event an um in den Non-Client Bereich meines Forms zu zeichnen. Nun möchte ich eine Fade-Animation für den Hover-Effekt hinzufügen. Nun ist mein Problem folgendes: Im Client Bereich kann ich über Invalidate() das Neuzeichen eines Bereichs auslösen. Nur wie erreiche ich dasselbe für den Non-Client Bereich.
Die Native-Methoden SetWindowPos und RedrawWindow ermöglichen zwar das Neuzeichnen, aber diese Methoden sorgen dafür dass die Darstellung des Formulars kurz unterbrochen wird. Dadurch zeichnet sich der Fade-Effekt sehr langsam und das Form reagiert nur sehr langsam. An den Zeichenfunktionen kann es nicht liegen denn beim Ändern der Formgröße wird die Oberfläche auch schnell gezeichnet.

Kennt jemand eine Möglichkeit den Non-Client Bereich des Forms schnell neuzuzeichnen.
Eventuell indem spezielle WindowMessages an das Form gesendet werden?

Gruß Daniel
 
Hallo Daniel,

was für einen hWndInsertAfter-Parameter verwendest du bei SetWindowPos? Ich denke, nur mit SWP_FRAMECHANGED (alle anderen Aktion ausgeschaltet: SWP_NO...) sollte lediglich die Non-Client-Area betroffen sein.

Gruß
MCoder
 
Den hWndInsertAfter hab ich im Moment auf IntPtr.Zero. Aber ich glaube zu meinst sowieso uFlags welche gesetzt sind. Zurzeit habe ich diese aktiv:
----------
SWP_NOREPOSITION(0x200)
SWP_DRAWFRAME/SWP_FRAMECHANGED (0x20)
SWP_NOACTIVATE(0x10)
SWP_NOZORDER(0x4)
SWP_NOMOVE(0x2)
SWP_NOSIZE(0x1)
-------

Nur SWP_FRAMECHANGED löst mir ein seltsames Verhalten des Forms aus. Die Position, Skalierung etc. werden mir natürlich aufgrund der fehlenden Flags aktualisiert.

Aber ich hatte einen anderen Bug in meiner Oberfläche. Ein Loop der Aktualisierungsmethode hat für die ungewollte Verlangsamung des Forms gesorgt.Zudem habe ich die Oberfläche doppelt aktualisiert (RedrawWindow und SetWindowPos) Funktioniert jetzt wunderbar mit der den Bugfixes. Jetzt muss ich nur noch dafür sorgen dass auch im Non-Client Bereich erkannt wird dass sich die Maus über dem Bereich befindet.

Gruß Daniel
 
Ich weiß. Ist kein Problem. Ich habe vor Zeiten ein kleines Skinning-Framework geschrieben welches mir es ermöglicht meinem Form einen benutzerdefinieren Stil zu verpassen (á la Office 2007, MacOs Stil etc). Geht nur darum dass ich die NCMouseMoves an mein Control im Clientbereich weitergebe. Ich sende einfach über SendMessage ein WM_MOUSEMOVE mit den entsprechenden Parameter an das Handle meines Controls. So bekomme ich einfach die negativen Koordinaten im MouseMove Event des Controls. Diese kann ich dann gegen meinen benutzerdefinieren Bereich welcher ins negative geht auf einen Hover validieren.
 

Neue Beiträge

Zurück