Suche "OnSizeChanged()"-Methode
-
Hallo,
ich suche eine MFC-Methode, die aufgerufen wird, wenn die Größe eines Dialogs mithilfe von SetWindowPos() oder MoveWindow() geändert wird. Also quasi sowas wie OnInitDialog(), nur dass es halt bei Größenänderung aufgerufen wird. Gibt es so eine Methode?Grüße
DaOne
-
Versuch's mal mit dem Naheliegenden: OnSize()
-
Danke dir, ich werds mal damit versuchen.
Nach sowas in der Art hatte ich auch schon gesucht, nur irgendwie ist die Suchfunktion von dem ganzen MSDN Zeug völlig unbrauchbar, sowohl auf der Website als auch lokal (ich habe hier VS 2005 Standard).
Dank Google habe ich allerdings etwas gefunden:
Google: onsize()Grüße
DaOne
-
Ich habe die OnSize() erstellt und sie wird auch aufgerufen. Nur bekomme ich jetzt einen "Debug Assertion Failed!"-Fehler wenn ich in der OnSize()-Methode die MoveWindow() oder SetWindowPos() eines Controls aufrufe.
Und zwar erzeuge ich einen Unterdialog mit Create() in meiner Anwendung. Auf diesem Unterdialog befindet sich das Control picture. Die OnSize() wird zweimal aufgerufen, wenn ich mein Programm starte, zuerst wenn ich die Create() des Unterdialogs aufrufe und das zweite mal wenn ich den Unterdialog mit SetWindowPos() verschiebe.
Beim ersten Aufruf kommt beim Verschieben von picture der Assertion-Fehler, später dann nicht mehr. Und zwar tritt der Fehler in der Datei winocc.cpp auf. Egal ob ich picture mit SetWindowPos() oder MoveWindow() verschiebe, die Zeilen, die den Fehler auslösen sind identisch und lauten folgendermaßen:
ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));
Hoffentlich kann mir jemand helfen, ich kenne mich mit der MFC fast nicht aus.
Danke schon mal im Voraus.DaOne
-
Der Grund ist einfach.
OnSize wird bereits aufgerufen wenn Dein Child-Control noch nicht erzeugt wurde. Prüfe also einfach ob das Child-Contrl wirklich schon angelegt ist, bevor Du MoveWindow verwendest.
-
Wie mache ich das am elegantesten (also MFC-like)?
Es handelt sich um ein Custom-Control. Ich habe es einfach in den Dialog reingezogen dort in den Eigenschaften die Klasse des Controls angegeben und ich rufe dann in der DoDataExchange() folgendes auf:
DDX_Control(pDX, IDC_PICTURE, picture);
Damit wird doch dann das Control richtig angelegt, oder?
Die DoDataExchange() wird allerdings erst nach OnSize() aufgerufen.
Also Lösung mache ich das jetzt mit GetSafeHwnd(), meine OnSize() sieht dann folgendermaßen aus:
void myDlg::OnSize(UINT nType, int cx, int cy) { if( picture.GetSafeHwnd() != NULL ) picture.MoveWindow(0, 50, 300, 300, TRUE); }
Es funktioniert jetzt auch, ich hoffe das ist so auch korrekt, wie ich das mache.
-
if (picture.m_hWnd)
Genügt GetSafeHwnd würde ich nur bei Zeigern verwenden!