11B15: wm_paint per SubClassProc



11B15: wm_paint per SubClassProc

David Strutz, 05.03.2008 00:56: Wie kann ich verhindern das dieser Quelltext in einer Endlosschleife abläuft?

cls
subClass %hWnd,1
while 1
   waitInput
wend
subClassProc
   if SubClassMessage(%hWnd,15)'wm_paint
   endIf
endProc


David Strutz, 05.03.2008 01:29: Indem man %hWnd's Style ändert: (WS_CLIPCHILDREN)

cls
SetStyle %hwnd, 1, GetStyle(%hwnd, 1) | $02000000' WS_CLIPCHILDREN // kein Flimmern z.B. beim Skalieren
subClass %hWnd,1
while 1
   waitInput
wend
subClassProc
   if SubClassMessage(%hWnd,15)'wm_paint
   endIf
endProc
@Roland: WS_CLIPCHILDREN sollte vielleicht _default sein?


RGH, 05.03.2008 01:35: While 1 : wend ist immer eine Endlosschleife!
Aber ich denke, du willst wissen, wie Du es anstellst, dass ein Zeichnen im wm_Paint-Abschnitt nicht gleich eine neue wm_Paint-Message auslöst und dadurch eine Endlosschleife entsteht.
Dafür gibt es in der Windows-API das Funktionspaar BeginPaint/EndPaint:


$H windows.ph
declare i&,PS#
dim PS#,28

cls
subClass %hWnd,1

while 1
    waitInput
wend

subClassProc
    if SubClassMessage(%hWnd,15)'wm_paint
      ~BeginPaint(%hWnd,PS#)
      drawtext 20,20,"Hugo was here"
      drawtext 50,50,str$(i&)
      inc i&
      ~EndPaint(%hWnd,PS#)
    endIf
endProc
Der Zähler i& ist da, damit man sieht, wann neugezeichnet wird. Wenn Du ~BeginPaint und ~EndPaint drin hast, so wie es nahezu jedes Windowsprogramm es hat, dann wird z.B. nur beim Verändern der Grösse des Hauptfensters neugezeichnet. Kommentierst Du diese Zeilen aus, wird nach dem ersten Zeichnen ständig neugezeichnet. (Keine Angst: Abbruch durch den Schliessen-Button geht natürlich trotzdem.)
BTW: Wenn Du ein Programm schreibst, dass WaitInput eigentlich nie Verlassen soll, weil Du alles über die Messages regelst (sozusagen Windowsprogrammierung "zu Fuss"), dann kannst Du statt Deiner Endlosschleife um WaitInput einfach den noch unkommentierten neuen Befehl WAITEND benutzen. Wie der Name andeutet, wird WAITEND erst beim Programmende verlassen:


$H windows.ph
declare i&,PS#
dim PS#,28

cls
subClass %hWnd,1

waitEnd

subClassProc
    if SubClassMessage(%hWnd,15)'wm_paint
      ~BeginPaint(%hWnd,PS#)
      drawtext 20,20,"Hugo was here"
      drawtext 50,50,str$(i&)
      inc i&
      ~EndPaint(%hWnd,PS#)
    endIf
endProc
Gruss
Roland


David Strutz, 05.03.2008 01:53: Die Erklärung ist wirklich super,
ich wollte aber eher darauf hinweisen das eben genau das nicht möglich ist. (ohne WS_CLIPCHILDREN)
Ebenso war leider festzustellen das ein wm_paint-per-subClassProc-Abfangen nicht wirklich sinnvoll ist da zwischen Waitinput zu Waitinput natürlich (aber auch leider) nicht "gesubclasst" wird.
wm_paint als userMessage endet auch im ewigen Loop.
Mein obiges "While 1" ist deshalb in XProfan keine tatsächliche Endlosschleife weil das WaitInput bei nicht gesetztem WindowStyle 512 das Programm beendet. (Diese Endlosschleife meinte ich also nicht, eher die Beobachtung im Taskmanager beim Testen vom ersten obigen Beispiel bei Fensterskalierung.)


David Strutz, 05.03.2008 01:58: waitEnd in Beta15?


RGH, 05.03.2008 02:28:   Zitat von ""iF"": „waitEnd in Beta15?
Ja!


RGH, 05.03.2008 15:54:   Zitat von ""RGH"": „
  Zitat von ""iF"": „waitEnd in Beta15?
Ja!

... allerdings vorerst nur im Interpreter.


David Strutz, 05.03.2008 16:14: Jaja, treib mich ruhig in den Wahnsinn...


Dies ist die Offlinevariante vom Thread [11B15: wm_paint per SubClassProc].

Valid CSS!

©2006 XProfan.Com