Laden...

WM_Paint unregelmässig

Erstellt von Nullpunkt vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.043 Views
N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 15 Jahren
WM_Paint unregelmässig

hi forum,
ich habe ein problem, welches ich nicht wirklich nachvollziehen kann.

ich fange die systemweiten windows messages ab und verarbeite dabei die
WM_Paint message. nur leider erhalte ich nicht alle, welche eigentlich kommen
müssten.

zum test habe ich in einer anderen, eigenen anwendung ein panel erstellt,
welches über einen timer jede sekunde die farbe wechselt. dies müsste dann
ja eigentlich sekündlich eine win-message senden, richtig?

zur ausgabe habe ich also den handle, die zahl der aktuellen sekunde und die
grösse der updateRegion ausgegeben. so siehts aus:

WM_PAINT    Handle: 7015456    Sekunde: 11   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 11   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 12   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 12   RgnSize: {Width=44, Height=118}
WM_PAINT    Handle: 7015456    Sekunde: 12   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 13   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 14   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 14   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 15   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 15   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 16   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 17   RgnSize: {Width=44, Height=118}
WM_PAINT    Handle: 7015456    Sekunde: 17   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 18   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 18   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 19   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 19   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 20   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 21   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 21   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 22   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 22   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 23   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 24   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 24   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 25   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 25   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 26   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 26   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 27   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 27   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 28   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 28   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 29   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 29   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 30   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 30   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 31   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 33   RgnSize: {Width=0, Height=0}
WM_PAINT    Handle: 7015456    Sekunde: 34   RgnSize: {Width=44, Height=118}
WM_PAINT    Handle: 7015456    Sekunde: 34   RgnSize: {Width=0, Height=0}

ihr seht also, in den sekunden 11 bis 34 werden nur 3 updates gesendet.
und warum soviele 'leere' messages kommen ist mir auch nicht ganz klar.

kann mir jemand auf die sprünge helfen?

mfg nullpunkt

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Nullpunkt,

zum test habe ich in einer anderen, eigenen anwendung ein panel erstellt,
welches über einen timer jede sekunde die farbe wechselt. dies müsste dann
ja eigentlich sekündlich eine win-message senden, richtig?

nicht unbedingt. Kommt darauf an, wie das in Panel implementiert ist. Ruf im Timer Invalidate auf. Dann sollte es klappen.

herbivore

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 15 Jahren

hi herbivore,
besten dank für den tip!

die sache ist die, dass ich mit dem panel nur eine veränderung simuliere.
grundsätzlich benötige ich die paint-messages von allen sich auf dem desktop
befindenden forms. (die hab ich auch, aber eben halt löchrig)

wie komme ich denn sonst an diese info ran?

mfg nullpunkt

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo Nullpunkt,

ich fange die systemweiten windows messages ab und verarbeite dabei die
WM_Paint message. nur leider erhalte ich nicht alle, welche eigentlich kommen
müssten.

ich hoffe aber, dass Du dann diesbezüglich keine weiteren Grafischen Verarbeitungen durchführst, denn im .NET ist das Senden der Paint-Nachricht in den meisten Controls automatisch nach grafischer Veränderung mit eingebaut, was dann unter Umständen einen Endloskreis erzeugen würde.

Darf ich fragen, wieso Du die Nachricht abfangen willst um diese dann zu verarbeiten, und was machst Du dann in der Verarbeitung?

[Vermutung]Ich habe auch schon den Verdacht, dass teilweise Windows auch direkt an bestimmte Controls Nachrichten schicken kann (über das Handle), so dass das Fenster z.B. nichts davon mitbekommt. Ich habe diese Vermutung aber nicht weiter verfolgt und verifiziert -> Würde aber dann bedeuten, dass Du alle Stellen von Win-Messages abfangen müsstest.[/Vermutung]

Viele Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

915 Beiträge seit 2006
vor 15 Jahren

Hrm, naja die WM_PAINT Methode ist ja nicht die einzige WindowsNachricht die für die Zeichenroutine genutzt wird. WM_PAINT, WM_NCPAINT, WM_ERASEBKGND wären hierbei die wichtigsten.

Wenn du also die Panelfarbe veränderst ist nicht zwingend gesagt das die Nachricht nur in WM_PAINT verarbeitet wird. Dazu kommt das viele Controls wiederum Controls beinhalten. Und auch hier kann es sein das die Nachrichten dann eben in den jeweiligen Childcontrols abgearbeitet werden oder mal im Parent...

Informationen wie das Handle des DeviceContext oder die Region sind auch etwas schwer zu unterscheiden. Bei der Region wird wieder unterschieden zwischen ClientRegion und tazächlicher Fenstergröße WindowRect. Bei gewissen Funktionen wie WM_NCCALCSIZE kommt noch hinzu wo das Fenster sich zuvor befunden hat und wohin es quasi wandert.

Um exakte Informationen zu bekommen kommst nur mit einer systemweiten Abfrage auf die Handles des jeweiligen Fensters nicht weit. Du musst weiterfiltern, das macht ja die Windowsnachrichten zu verarbeiten so mühsam.

Die Frage ist halt nur was du genau vorhast und wie du die Nachrichten abfängst, ob SubClassing oder Hooks usw.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 15 Jahren

hi ihr zwei
also die messages exportiere ich über eine c-dll. ich empfange in meiner c#-app
alle messages. also auch die von Andreas.May genannten.

das problem betreffend der 'endlosschleife' ist mir klar, betrifft mich aber nicht,
da die messages von einem anderen arbeitsplatza auf den empfangenden
computer gesendet werden.

grundsätzlich soll daraus mal ein vnc-ähnliches support-tool entstehen.
mir ist bewusst, dass es schon zahlreiche, sehr gute opensource-tools gibt.

aber ich möchte mich mit diesem thema gerne auseinandersetzen.

mfg nullpunkt

EDIT:
-> ich bekomme während des farbwechsels des panels kein WM_NCPAINT.
-> im WM_PAINT erhalte ich genau die grösse des panels. die message wird
in diesem fall also wahrscheinlich nicht untergehen von wegen child-controls etc.

EDIT2:
habe mir den source vom realvnc mal angeschaut und stelle fest, dass dort
nur mit WM_PAINT gearbeitet wird bzw. nicht mit WM_NCPAINT oder WM_ERASEBKGND.

any idea?

383 Beiträge seit 2006
vor 15 Jahren

und wenn Du dich z.Bsp. mit dem Winspector an dein Test-Panel hängst, kommen dann die selben "komischen" Resultate?

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 15 Jahren

hi,
seltsamerweise erhalte ich nicht bei jedem start dieselben ergebnisse.

teilweise decken sich die aufzeichnungen ganz genau mit den meinen.
also immer nur die WM_PAINT. (das updated rectangle kann ich mit diese tool nicht prüfen)

teilweise (nach restart des winspectors) erhalte ich aber auch jeweils ein WM_ERASEBKGND zusammen mit den 'normalen' WM_PAINTs.

würde sich das projekt jemand anschauen, wenn ich es zusammengestaucht hochladen würde?

mfg nullpunkt

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 15 Jahren

ich muss dieses thema leider nochmals vorkramen, da ich auch nach wochenlanger
suche einfach nicht weiterkomme.

ich glaube ich habe das problem soweit isoliert: ich erhalte keine 'WM_ERASEBKGND' - messages.

ich habe das gefühl, dass das problem beim exportieren der hooks liegt. vielleicht würde sich die hooks jemand mit etwas c-erfahrung mal anschauen?

die hooks können hier runtergeladen werden:
Global-Hooks

author/quelle:
http://www.xaipete.net/softdev/

bin über jeden tipp dankbar
mfg nullpunkt

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 15 Jahren

hi,
ich muss diesen alten thread leider nochmals pushen und bitte erneut um
hilfe eines c-experten, welcher mir vielleicht die c-hooks anschauen könnte.

ich bin mittlerweile bereit für die lösung des problems zu bezahlen.

mfg nullpunkt