 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 26.04.2010, 10:11 Titel: CallBack Verständnisfrage |
|
|
Hi zusammen, heut hab ich mal ne Frage die rein dem Verständnis dient. Weil, ich vesteh es nämlich nicht
Folgende Situation. Ein Fenster mit einem TreeView und einem Static Control. Bei beiden Elementen manipuliere ich den Hintergrund, werte also die WM_PAINT und WM_ERASEBKGND aus.
Zunächst erstmal: Es funktioniert alles und es flimmert auch nix.
Aber: Um dies zu erreichen musste ich ganz schön rumspielen und ausprobieren weil das ganze (für mein Verständnis) nicht so abläuft wie es das sollte. Hier mal der Pseudo Code:
Code: |
'Fenster und Controls erstellen
'Callbacks setzen
Old_Proc_TreeView = SetWindowLong( hTrV, GWL_WNDPROC, @CallBack_Proc_TreeView() )
Old_Proc_StatusImg = SetWindowLong( hImg, GWL_WNDPROC, @CallBack_Proc_StatusImage() )
'*************************************************************
'CallBack Funktion Static Control:
Select Case uMsg
Case WM_ERASEBKGND
Return 1
Case WM_PAINT
'zeichnen des Hintergrundes
Return DefWindowProc( hWnd, uMsg, wParam, lParam )
End Select
Return CallWindowProc( Old_Proc_StatusImg, hWnd, uMsg, wParam, lParam )
'*************************************************************
'CallBack Funktion TreeView:
result = CallWindowProc( Old_Proc_TreeView, hWnd, uMsg, wParam, lParam )
Select Case uMsg
Case WM_ERASEBKGND
Return 1
'TreeView darstellen
Case WM_PAINT
'Hintergrund zeichnen
End Select
Return result
|
Ok, Hauptsächlich geht es mir darum wann und wie ich die WindowProc aufrufe, also ob per CallWindowProc oder DefWindowProc.
Klar ist: Ich muß diese Funktionen ausführen um die Messages abhandeln zu lassen. Aber Flimmerfrei funktioniert es nur in obiger Konstellation. Also der zeitpunkt und die Art des Aufrufs - und das will mir nicht in den Kopf.
Kann das jemand erklären? _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 26.04.2010, 15:46 Titel: |
|
|
Ich verstehe jetzt nicht wirklich wo dein Verständnisproblem liegt...!? |
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 26.04.2010, 16:06 Titel: |
|
|
OK, ich versuch's nochmal zu erklären.
Ich muß bei einer CallBack Funktion die Messages für die originale Message Routine bearbeiten. Dies kann ich entweder über DefWindowProc oder über CallWindowProc machen. Das ist soweit klar.
Allerdings ist die Frage zu welchem Zeitpunkt ich dies mache.
Im TreeView CallBack benutze ich CallWindowProc VOR der Ausführung des Select Case Blockes und dem Erkennen der WM_PAINT Message. habe ich diese Message bearbeitet, kehre ich mit dem Result zurück.
Im CallBack des Static Elements kommt erst der Select Case Block, mit Auswertung der WM_PAINT NAchricht, dann kehre ich zurück, allerdings mit DefWindowProc.
Führe ich hier DefWindowProc, wie im TreeView, vorher aus, oder benutze stattdessen CallWindowProc, flackert alles wie wild und Mausklicks werden nicht mehr erkannt.
Im Umkehrschluß, wenn ich im CallBack des TreeView versuche die Aufrufe so zu gestalten wie beim Static, wird dort der Hintergrund nicht neu gezeichnet, so als ginge die WM_PAINT völlig verloren. Maus Klicks werden zwar erfasst, aber ich sehe ja nicht wohin ich klicke.
Das ist es was mich verwirrt. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 26.04.2010, 17:32 Titel: |
|
|
Hm das werden dann wohl spezifische Eigenheiten der jeweiligen Controls sein. Ich könnte mir auch vorstellen, dass u.U. einige interne Strukturen nicht richtig übernommen werden. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|