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?


  • Mod

    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.


  • Mod

    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


  • Mod

    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


Anmelden zum Antworten