CPropertyPage und OnInitDialog()
-
Hallo
Kann es eventuell daran liegen, dass die Dieloge vorher von CDialog abgeleitet waren und ich das nun von Hand geändert habe?
Aufruf:
CPropertyPage page1(IDD_CLUBGENERAL); CPropertyPage page2(IDD_CLUBSTADIUM); CPropertyPage page3(IDD_CLUBCOACH); ctlTab.AddPage(&page1); ctlTab.AddPage(&page2); ctlTab.AddPage(&page3); ctlTab.DoModal();
Vielen Dank für eure Hilfe
chrische
-
Keine Ahnung, ob es daran liegt, aber wenn du schon CDialog in CPropertyPage änderst, dann solltest du das vielleich auch überall machen. In der cpp steht z.B. noch mindestens ein CDialog. Vielleicht liegt es ja daran...
-
Ich nutze die Klassen meist etwas anders (es gab da mal ein Beispiel von Microsoft zum Thema CPropertyPage/ CPropertyPage):
1. eigene PropertySheetKlasse (MeinPropertySheet) anlegen
2. Im Konstrukter mit AddPage die Seiten hinzufügen
3. Aufruf:MeinProperySheet dlg(„Überschrift“,NULL) dlg.DoModal();
So, wie Du es hast, sollte es auch gehen, allerdings habe ich beim Test dem PropertyPage die IDs nicht übergeben, keine Ahnung, ob das einen Einfluss hat:
CPropertyPage page1; CPropertyPage page2; CPropertyPage page3; etc
Wenn du von einem CDialog zum CPropertyPage änderst, gibt es 3 Dinge zu beachten:
1. Konstruktor des Dialoges ändern (hast Du getan)
2. Basisklasse ändern von CDialog zu CPropertyPage (hast Du teilweise getan)
3. mindestens folgende Dialogeigenschaften ändern:deaktiviert: true->false Stil : Kontextmenü->Untergeordnet Rahmen: Dialogfeldr.->dünn Systemmenu: true->false
Vielleicht liegt es daran? Oder jemand anders weiß mehr?
-
Tester2 schrieb:
deaktiviert: true->false Stil : Kontextmenü->Untergeordnet Rahmen: Dialogfeldr.->dünn Systemmenu: true->false
IMHO sind diese Änderungen in der Ressource nicht nötig. Das macht der Ressource Handler selber. Der baut sich den Dialog schon so, wie er ihn braucht.
-
Hallo
Erstmal vielen Dank für die zahlreichen Tipps, nur helfen Sie mir nicht weiter. Immer noch das gleiche Problem:
Die Dialoge (CPropertyPages) werden angezeigt (mit allem, was auch im Editor zu sehen ist - zwar nicht im gewohnten grau, sondern etwas heller in weiß), aber die OnInitDialog-Funktion wird einfach nicht aufgerufen.
chrische
-
Hört sich für mich so an, als ob das irgendwo anders in die Grütze läuft. Vielleicht doppelte ID in der resource.h oder Überbleibsel von bereits gelöschten Steuerelementen oder sowas in der Art.
Kommentier deinen eigenen Kram in der OnInitDialog mal aus und mach einfach nur eine MessageBox rein -> gucken, was passiert und evtl. das eigene Zeug nach und nach wieder mit auf nehmen.
Rebuild All hast du ja hoffentlich schon gemacht. Wird OnSetActive denn ausgeführt? usw. usf.
-
Mit Sicherheit läuft hier was mit den Nachrichten schief. Wenn der Hintergrund nicht korrekt gezeichnet wird, dann ist dies ein eindeutiger Hinweis.
Bist Du sicher dass alle Message Maps auch korrekt definiert wurden?
-
Hallo
Martin Richter schrieb:
Bist Du sicher dass alle Message Maps auch korrekt definiert wurden?
Da ich bin ich gar nicht sicher, aber ich weiß nicht recht, was du meinst und wie ich das eventuell beheben könnte.
chrische
-
Anders gefragt: Bist Du sicher, dass überall die korrekte Parent Klasse in den Message Maps eingetragen ist:
BEGIN_MESSAGE_MAP(ClubGeneral, CPropertyPage)
-
Hallo
Ich weiß nicht, wo man das überall eintragen kann, aber an der einzigsten Stelle, an der BEGIN_MESSAGE_MAP steht, dort ist es richtig:
// ClubGeneral.cpp : implementation file // #include "stdafx.h" #include "BLM-Editor.h" #include "ClubGeneral.h" #include "AddClubs.h" #include "Functions.h" #include "BLMIni.h" // ClubGeneral dialog IMPLEMENT_DYNAMIC(ClubGeneral, CPropertyPage) ClubGeneral::ClubGeneral(/*CWnd* pParent =NULL*/) : CPropertyPage(ClubGeneral::IDD/*, pParent*/) { } ClubGeneral::~ClubGeneral() { } void ClubGeneral::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); DDX_Control(pDX, IDC_HOWMANYFANS, ctlHowManyFans); DDX_Control(pDX, IDC_PUBLICSTANDING, ctlPublicStanding); } BEGIN_MESSAGE_MAP(ClubGeneral, CPropertyPage) END_MESSAGE_MAP() // ClubGeneral message handlers BOOL ClubGeneral::OnInitDialog() { CPropertyPage::OnInitDialog(); CStringArray TempStrings; chrische::GetIni()->GetKeyNames(_T("How_Many_Fans"), &TempStrings); for(int i=0; i<TempStrings.GetSize(); ++i) ctlHowManyFans.AddString(chrische::GetIni()->GetString(_T("How_Many_Fans"), TempStrings.ElementAt(i))); chrische::GetIni()->GetKeyNames(_T("Public_Standing"), &TempStrings); for(int i=0; i<TempStrings.GetSize(); ++i) ctlPublicStanding.AddString(chrische::GetIni()->GetString(_T("Public_Standing"), TempStrings.ElementAt(i))); if(GetData()->GetIsNewClub()) { ctlHowManyFans.SetCurSel(2); ctlPublicStanding.SetCurSel(2); SetDlgItemText(IDC_CLUBID, chrische::GetIDStringForNewItem(CLUB)); } else { //alle Felder mit den Werten aus dem, zu editierenden Club, füllen SetDlgItemText(IDC_CLUBNAME, GetData()->GetClubForEdit()->GetName()); SetDlgItemText(IDC_CLUBSHORTNAME, GetData()->GetClubForEdit()->GetShortName()); SetDlgItemText(IDC_PRESIDENTSURNAME, GetData()->GetClubForEdit()->GetSurNameOfPresident()); SetDlgItemText(IDC_PRESIDENTNAME, GetData()->GetClubForEdit()->GetNameOfPresident()); CString Temp; Temp.Format(_T("%d"), GetData()->GetClubForEdit()->GetYearOfFoundation()); SetDlgItemText(IDC_YEAROFFOUNDATION, Temp); Temp.Format(_T("%d"), GetData()->GetClubForEdit()->GetNumberOfMembers()); SetDlgItemText(IDC_NUMBEROFMEMBERS, Temp); ctlHowManyFans.SetCurSel(GetData()->GetClubForEdit()->GetHowManyFans()); ctlPublicStanding.SetCurSel(GetData()->GetClubForEdit()->GetPublicStanding()); SetDlgItemText(IDC_MANAGERSURNAME, GetData()->GetClubForEdit()->GetSurNameOfManager()); SetDlgItemText(IDC_MANAGERNAME, GetData()->GetClubForEdit()->GetNameOfManager()); SetDlgItemText(IDC_CLUBID, GetData()->GetClubForEdit()->GetID()); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
Noch einmal die komplette cpp-Datei
chrische
-
Hallo
Nun langsam weiß ich gar nicht mehr weiter: Ich habe nun zum Spass mal einen neuen Reiter erstellen wollen:
- neuen Dialog erstellt
- diesen von CPropertyPage abgeleitet
- eine OnInitDialogFunktion hinzugefügt
- so wollte ich den neuen Tab hinzufügen:CPropertyPage page1(IDD_CLUBGENERAL); CPropertyPage page2(IDD_CLUBSTADIUM); CPropertyPage page3(IDD_CLUBCOACH); CPropertyPage page4(IDD_CLUBPLAYERS); //neuer Tab ctlTab.AddPage(&page1); ctlTab.AddPage(&page2); ctlTab.AddPage(&page3); ctlTab.AddPage(&page4); //neuer Tab ctlTab.DoModal();
Wenn ich jetzt starte, werde mir nur die ersten drei Tabs angezeigt und der vierte existiert nirgendwo.
chrische