Probleme mit Child-Fenstern
-
ich versuche eine wrapper klasse zu erstellen aber es treten immer wieder probleme auf, so wie immer. ich scheitere zum beispiel jetzt daran, buttons hinzuzufügen die als parent nicht das hauptfenster haben, sondern beispielsweise eine groupbox. alle nachrichten die rausgeschickt werden wenn der button geklickt wird kommen dann zur groupbox und nicht zum hauptfenster, also kann ich die nicht verarbeiten. wenn das parent fenster das hauptfenster ist kommt zwar die nachricht, aber dann geht die positionierung nicht weil die position 0,0 des buttons die position der groupbox sein sollte, stattdessen wär der button aber ganz oben links im hauptfenster.
jemand ne idee?
-
Einfach die Buttonnachrichten in der Groupbox-Klasse verarbeiten. Alternativ mit SetWindowLong die Buttonnachrichten in dein Hauptfenster umleiten, aber das wird sehr unübersichtlich, da dann eine Funktion jedes Fenster behandeln muss. Alternativ kannst du auch die Position des Owners zu den Positionierungskoordinaten addieren und es stimmt wieder.
-
letzten vorschlag versuche ich grad. ich hab ne funktion erstellt die alle x werde addiert, sodass das element richtig positioniert wird. aber immer wenn diese verdammte funktion aufgerufen wird, geht die funktion in der sie vorkommt nicht weiter. sowas hab ich noch nie gesehen. das programm läuft zwar und crasht nicht, aber die funktion kommt nie zum ende nachdem diese verdammte funktion aufgerufen wird, sie hat int als return wert aber es wird nie was zurückgegeben, trotzdem crasht es nicht. hier die funktion:
int WinWrap::getAbsX() const { if(parent) return getX()+parent->getAbsX(); return 0; }
parent ist ein pointer zu einem WinWrap objekt. nur beim hauptfenster ist das NULL.
***** edit: hat sich erledigt, ich hab parent nicht mit NULL initialisiert weil ich dachte das passiert automatisch, also war es immer true.
eine andere frage: wenn ich ein object aus einmel vector abrufe und davon die adresse nehme ist das die tatsächeliche adresse des objekts im vector oder wird das beim abrufen mit at(int) kopiert?
ich schaffs immernoch nicht die absolute position zu berechen. zum ausrasten... die verdammte messagebox wird immer richtig positioniert (rechts am hauptfenster in diesem fall), der button in der messagebox ist nur ganz am anfang an der richtigen position, danach bleibt er nur da.
hier ein teil des codes der bei änderung der fenstergröße ausgeführt wird:x=(getRectWidth(&parent)-getWidth()+getAbsX());
parent ist in diesem fall das RECT der clientarea des parents. der code für getAbsX() ist ja oben zu sehen.
x ist dann die neue position im hauptfenster.
-
Nikolai schrieb:
eine andere frage: wenn ich ein object aus einmel vector abrufe und davon die adresse nehme ist das die tatsächeliche adresse des objekts im vector oder wird das beim abrufen mit at(int) kopiert?
Es ist die richtige Adresse. Wenn du jedoch Objekte im std::vector hinzufügst, kann es sein, dass alles umkopiert wird und die Adresse nicht mehr gültig ist. Statt den Pointer zu speichern merk dir lieber den Index. Aber wahrscheinlich willst du gar keinen vector sondern einfach eine Variable, wenn du sowas machen musst.