Wenn ich PropertyPage nehme, dann erkennt es nicht und sagt unbekannter bezeichner.
Du hast ja auch kein Document-View-Modell, sondern eine dialogbasierte Anwendung ...
Wie kann ich Daten von einer Propertypage auslesen bzw. übergeben?
Hast Du zu den einzelnen Property-Pages entsprechende Membervariablen hinzugefügt bzw. die Klassen erzeugen lassen?
Wenn noch nicht: Im Dialogeditor auf die Seite rechtsklicken und Klasse hinzufügen ... (o.ä.) wählen. Den Namen für die Property-Page eingeben und die Basisklasse wählen (CPropertyPage) (*).
Wenn die Klasse erzeugt wurde, auf die Controls rechtsklicken und eine Variable hinzufügen (idR.->Wert' - o.ä., ich verwende die englische Version; nicht->Control'). Dann wählst Du den Typ, den Du möchtest (CString, int, ...) und, falls sinnvoll, einen Wertebereich (bei int z.B. Minimal- und Maximalwert).
Diese Variablen werden standardmäßig als public angelegt, Du kannst also von außen über die Property-Page auf sie zugreifen. Initialisiert werden sie im Konstruktor der jeweiligen Property-Page; Du kannst ihnen auch in->OnInitDialog' der Property-Pages Werte zuweisen (also bevor die PP angezeigt wird).
(*)
Der automatisch erstellte Konstruktur ist dann parameterlos, Erzeugung also
...
CPropertyPage* ppge1= new CMyPage01();
CPropertyPage* ppge2= new CMyPage02();
AddPage(ppge1);
AddPage(ppge2);
SetWizardMode();
...
o.ä.
BTW: Falls Du die Buttons noch nicht angepasst hast ...
In der jeweiligen PP->OnSetActive' überschreiben lassen; dort dann die Buttons setzen. Auf der ersten Seite
BOOL CMyPage01::OnSetActive()
{
CPropertySheet* parent = reinterpret_cast<CPropertySheet*>(GetParent());
parent->SetWizardButtons(PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
Auf der letzten Seite z.B.
BOOL CMyPage02::OnSetActive()
{
CPropertySheet* parent = reinterpret_cast<CPropertySheet*>(GetParent());
parent->SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);
return CPropertyPage::OnSetActive();
}
Du kannst auf Finish reagieren, indem Du->OnWizardFinish' überschreiben lässt (damit meine ich, vom Wizard die Methode generieren lässt; Du kannst sie natürlich auch von Hand einfügen; in diesem Fall die Header-Datei nicht vergessen:->virtual BOOL OnWizardFinish();'):
BOOL CMyPage02::OnWizardFinish()
{
// ... hier nötiger Code
// Wenn Du die Variablen-Werte brauchst,->UpdateData(TRUE)' nicht vergessen; das wird sonst erst
// anschließend gemacht.
return CPropertyPage::OnWizardFinish();
}
Du kannst auch von den Property-Pages aus öffentliche Funktionen Deiner Property-Sheet-Klasse aufrufen; dazu musst Du aber casten:
CMyPropertySheet* ps = reinterpret_cast<CMyPropertySheet*>(GetParent());
parent->...
Nicht die nötigen includes vergessen.
Auch wenn Du von außen auf die Variablen der Poperty-Pages zugreifen willst, musst Du casten, wenn Du nur ein CPropertyPage-Objekt hast.
CMyPage01* pp = reinterpret_cast<CMyPage01*>(propertySheet.GetPage(0));
Es ist übrigens nicht die feine objektorientierte Art, direkt auf die Variablen zuzugreifen; wenn Du es anders machen willst, kannst Du im einfachsten Fall die Variablen private machen und Methoden in Deine PropertyPage-Klassen einfügen, die die Daten zurückgeben:
void MyPage01::GetData(CString& value1, int& value2, ...) ...
Auch dort nicht->UpdateData(TRUE)' vergessen.
Setzen der Variablen: Auch eine solche Methode verwenden [und dann->UpdateData(FALSE)']; normalerweise reicht aber die Initialisierung im Konstruktor (-> Konstruktor-Parameter).
Ich hoffe, dass Du damit klar kommst, für mehr habe ich gerade keine Zeit (auch nicht zum Korrekturlesen).