controls subclass API plain

Thomasio

Erfahrenes Mitglied
Ich habe mir richtig was vorgenommen und stehe schon gleich am Anfang auf dem Schlauch, vielleicht kann mir jemand hier etwas Starthilfe geben?

Ich habe 3 Child Fenster, die im Hauptfenster alle übereinander liegen, sprich es ist immer nur eins davon sichtbar
2 davon enthalten je eine listbox, die ich gern subclassen möchte, damit ich an events wie WM_ERASEBKGND ran komme

Erstes Problem:
Wenn eine der beiden listboxen sichtbar wird, muss ich im parent eine ClipRgn setzen, wird das dritte Child sichtbar (oder alle 3 unsichtbar) muss ich die ClipRgn wieder entfernen
Das ist mal völliges Neuland für mich und die Erklärung bei MSDN dazu ist mir zu hoch
Ich weiss nicht mal in welchem Event von welchem Fenster ich das eintragen sollte, geschweige denn die Syntax

Zweites Problem:
Listboxen, edit controls usw haben eine Menge mehr events als "normale" Fenster
Im Web finde ich ein Dutzend Seiten die einige dieser extra Events für Visual C++ oder .NET erklären, aber nicht eine für API plain
Bei MSDN finde ich Listen von Messages die man an ein control senden kann, aber keine "Übersetzung", wie das Event in der Subclass dann heisst oder wie man es behandeln kann und was man jeweils zurück geben muss
Ein paar Sachen findet man mit Trial & Error schon raus, z.B. dass OnEraseBkgnd bei mir case WM_ERASEBKGND heissen muss ist klar, auch dass man statt return FALSE bei mir return 1 schreiben muss habe ich noch rausgefunden, aber nur weil es dieses Event auch im "normalen" Fenster gibt
Wo finde ich den eine Liste der Events, die es im "normalen" Fenster nicht gibt? Am besten eine die ein Anfänger auch versteht

Drittes Problem:
Wenn ich in der Subclass WM_PAINT abfange und versuche via OffScreenDC ein double buffering einzubauen (weil listboxen ohne double buffer oft heftig flackern), bekomme ich Chaos
Mal zeigt er gar nichts an, mal flackert es noch schlimmer als vorher, mal zeichnet er nicht neu wenn LBN_SELCHANGE passiert, usw.
Im Web habe ich folgendes gefunden:

Code:
void CRecordList::OnPaint()
   {
      CPaintDC dc(this);
      CMemDC memDC(&dc);

      CRect clip;
      memDC.GetClipBox(&clip);
      memDC.FillSolidRect(clip, GetSysColor(COLOR_WINDOW));

      DefWindowProc(WM_PAINT, (WPARAM)memDC->m_hDC, (LPARAM)0);
   }

aber die "Übersetzung" nach API plain bringe ich nicht auf die Reihe

Jeder der mal einen Windows Editor mit viel Text in der Grösse geändert hat weiss, dass nicht mal M$ die controls flackerfrei hin bekommt, kann mir trotzdem jemand helfen?
 
Also ich gehe mal von C WINAPI aus.

Vorweg: Gibt es einen bestimmten Grund warum du die Listboxen in eigene nochmal Extra
fenster packst?

1.
So wie ich das verstehe willst du bei einer bestimmten Aktion eines der ChildFenster
anzeigen lassen und die anderen beiden verschwinden lassen. Reicht es da nicht einfach
die beiden ChildFenster auf SW_HIDE und das andere was angezeigt wird auf SW_SHOW
zu setzen?

2.
Du brauchst die ListBox messages?
http://msdn2.microsoft.com/en-us/library/bb775146.aspx
Du hast über die notofy messages in der MSDN nichts gefunden? "Notifications"

3.
Mit dem Flackern kann ich dir nicht sonderlich helfen. Ich weis nicht ob man nur das
Hauptfenster oder auch die Listboxen selbst im WM_PAINT erst auf ein anderes HDC
zeichnen muss und dann hm... BitBlt auf den richtigen oder irgendwie sowas.
Nen anderen HDC könnte man glaube ich mit CreateCompatibleDC(HDC hdc) erstellen,
wobei der HDC parameter der HDC des Fensters ist.

Best wishes
FBIagent
 
Erstmal danke für die Antwort

1) Ja es gibt mehrere Gründe, warum die Listboxen in jeweils eigenen Fenstern sind
z.B. weil diese nicht wirklich eigene Fenster sind, sondern Unterfenster vom Hauptfenster in denen jeweils noch einiges Andere drin ist

2) Die Liste bei MSDN ist wirkich nicht besonders übersichtlich, ich habe die letzten 24 Std damit zugebracht mich quer durch Google zu lesen bis ich alles halbwegs beieinander hatte, hat man die Begriffe einmal, findet man sie auch bei MSDN, aber so Sachen wie LVN_ITEMCHANGING finden sich in der Liste nicht so einfach

3) Das Flackern bin ich seit etwa einer halben Stunde los, ich musste "nur" die listbox subclassen und alle möglichen Messages inkl SELCHANGE und ähnlichen abfangen, mit 100 Tricks der Marke REDRAW false - ADDSTRING - REDRAW true sämtliche Windows Automatiken austricksen, double buffering zu Fuss implementieren und schon gehts ohne flackern

Nur ein Problem ist mir geblieben, im Falle von VSCROLL, da komme ich mit dem Index der Einträge noch nicht klar, sprich meine Versuche eine Schleife zu bauen die in meiner Subclass nur die sichtbaren Einträge anzeigt und dabei auch die Scrollbar richtig setzt sind bis jetzt gescheitert, entweder schlägt die Windows Automatik wieder durch und paintet mir die listbox falsch, oder irgendwo wird ein ERASEBKGND nicht abgefangen, oder die Scrollbar steht falsch, oder man kann gar nicht scrollen
Im Moment habe ich das dadurch gelöst, dass die Listbox einfach länger ist als das Maximum ihrer Einträge, aber irgendwann (ich fürchte sehr bald) werde ich auch dies "richtig" lösen müssen

Grad im Moment bin ich stolz wie Oskar, dass ich Anfänger das so weit hinbekommen habe
 
Zurück