Probleme mit subclassing von button -> repaint funktioniert nicht
-
und das sorgt wofür? dafür das der button nicht gezeichnet wird?
-
Nein, daß der von dir frisch gezeichnete Inhalt wieder überpinselt wird
Wenn du etwas selber komplett erledigt hast, brauchst du nicht mehr auf die Standardimplementierung zurückgreifen.
-
was sollte ich stattdessen machen? das bitmap soll aufn button, (ziemlich) egal wie
-
bau dir doch deine ButtonProc so auf wie die WndProc:
case WM_PAINT: //... Button zeichnen return 0;In dem Block steht alles drin, was dein Programm zum Zeichnen wissen muß, damit ist die Nachrichtenbehandlung fertig.
(eventuell müsstest du den Rückgabewert noch anpassen - aber da kann dir die WinAPI-Doku eher weiterhelfen)
-
im sourcecode kann man sehen, dass wndproc u. buttonproc gleich aufgebaut sind, allerdings tritt dann das oben beschriebene problem auf. lasse ich das beginpaint weg, erscheint zwar der button komplett, aber ohne bitmap
-
das Problem ist eben, daß sie NICHT komplett gleich aufgebaut sind:
// etwas vereinfacht: WndProc(...) { switch(message) { case WM_xxx: // handle Message xxx return 0; // verlässt die Funktion case WM_yyy: // handle Message yyy return 0; //... } return DefWindowProc(...); // nur aufgerufen, wenn keiner der case... aktiv wurde } ButtonProc(...) { switch(message) { case WM_xxx: // handle Message xxx break; // verlässt nicht die Funktion, sondern nur den switch() //... } return CallWindowProc(...); // in jedem Fall nach deiner Nachrichtenbehandlung aufgerufen }
-
das heißt, ich sollte bei einem button die WM_PAINT-Nachricht VOLLKOMMEN alleine übernehmen... Achso...
ok, ich probiers
-
ich habe jetzt den fehler gefunden! die WM_CREATE-nachricht wird nicht aufgerufen (warum auch immer), ich habe die sachen aus der wm_create einfach beim ersten aufruf der wm_paint machen lass -> geht
danke für eure hilfe, auch wenn der fehler letztlich woanders lag
-
Naja, das ist so nicht richtig.
Das WM_CREATE wird auch bei den Buttons aufgerufen, nur landen diese Aufrufe nicht in Deiner eigenen WndProc, was aber ganz einfach daran liegt, dass Du die WndProc ja erst nach dem Aufruf von CreateWindow (also nach dem Erstellen) änderst.
-
ok wie auch immer, ich weiß jetzt wo mein fehler lag.
danke für die hilfe,
euer ItsNotYou