Kliknij przycisk OK, zatwierdzajc decyzj i zamykajc okno.
Dodae zmienn skadow dla kontrolki w dialogu. Teraz musisz jeszcze doda jedn zmienn dla wartoci w tej kontrolce. Ponownie kliknij przycisk Add Variable, lecz tym razem jako nazw zmiennej wpisz m_AlignmentValue, jako jej kategori wybierz Value, za jako jej rodzaj wybierz typ int. Kliknij przycisk OK, zatwierdzajc decyzj i zamykajc okno. Zamknij okno ClassWizarda, zatwierdzajc utworzenie dwch nowych zmiennych skadowych.
Kod zarzdzajcy wymian danych pomidzy kontrolk a arkuszem waciwoci umiecimy wewntrz funkcji DoDataExchange (). Otwrz plik rdowy MFCControlWinPpg.cpp i zlokalizuj funkcj DoDataExchange (). Zwr uwag, e ClassWizard doda dwie linie kodu do oryginalnej implementacji tej funkcji:
void CMFCControlWinPropPage::DoDataExchange(CDataExchange* pDX) {
//{{AFX_DATA_MAP(CMFCControlWinPropPage)
DDX_Control(pDX, IDC_ALIGNMENTCOMBO, m_AlignmentCombo) ;
DDX_CBIndex(pDX, IDC_ALIGNMENTCOMBO, m_AlignmentValue);
//}}AFX_DATA_MAP
DDP_PostProcessing(pDX);
}
DDX_control to standardowe makro MFC do adowania wartoci kontrolki do zmiennej skadowej klasy MFC. DDX_CBindex to standardowa funkcja MFC do pobierania i ustawiania biecego indeksu pozycji na rozwijanej licie na podstawie dostarczonej zmiennej (w tym przypadku m_AlignmentValue). Aby w peni powiza kontrolk z arkuszem waciwoci, musisz nieco zmodyfikowa ten kod:
void CMFCControlWinPropPage::DoDataExchange(CDataExchange* pDX)
{
//{{AFX_DATA_MAP(CMFCControlWinPropPage)
DDX_Control(pDX, IDC_ALIGNMENTCOMBO, m_AlignmentCombo);
//}}AFX_DATA_MAP
if(!pDX->m_bSaveAndValidate)
{
// upewnij si, e wyczycilimy list m_AlignmentCombo.ResetContent(); m_AlignmentCombo.AddString(_T("Do lewej"}); m_AlignmentCombo.AddString(_T("Do rodka")); m_AlignmentCombo.AddString(_T("Do prawej"));
}
DDP_CBIndex(pDX, IDC_ALIGNMENTCOMBO, m_AlignmentValue,
_T("Alignment"));
DDX_CBIndex(pDX, IDC_ALIGNMENTCOMBO, m_AlignmentValue) DDP_PostProcessing(pDX);
this->SetModifiedFlag();
}
Zmodyfikowana funkcja robi znacznie wicej ni orygina. Po pierwsze, wypenia rozwijan list poprawnymi wartociami, dziki czemu arkusz waciwoci odpowiada
wartoci waciwoci w kontrolce oraz w przegldarce waciwoci. Poprzez sprawdzenie zmiennej m_bSaveAndValidate zapewniamy, e te wartoci s adowane tylko raz, podczas pierwszego wywoania arkusza. Innymi sowy, kod zapewnia, e arkusz waciwoci nie zachowuje i nie zatwierdza zawartych w nim danych.
W celu zapewnienia komunikacji pomidzy kontrolk a arkuszem waciwoci musisz doda przed wywoaniem funkcji DDX_CBindex () wywoanie funkcji DDp_CBindex {). Funkcja DDP_CBindex () instruuje MFC, by podczas adowania dialogu pobrao od kontrolki warto waciwoci Alignment i umiecio j w zmiennej skadowej m_Aiignmentvalue arkusza waciwoci. Podczas zamykania okna dialogowego funkcja DDP_CBindex () pobiera biecy indeks zaznaczonej pozycji rozwijanej listy i przypisuje t warto waciwoci Alignment kontrolki. Funkcja DDP_CBindex{) musi by wywoana przed funkcj DDX_CBindex (), gdy w przeciwnym razie arkusz waciwoci nie bdzie poprawnie odzwierciedla wartoci waciwoci kontrolki.
Warto zapamita, e ten arkusz waciwoci wymaga specyficznej implementacji. Innymi sowy, klasa aduje kontrolk rozwijanej listy do zmiennej skadowej m_Alignment-combo klasy arkusza waciwoci oraz e konieczne jest zaadowanie pozycji wybranego elementu listy przed ustawieniem biecej pozycji na licie. Z powodu specjalnej implementacji arkusza waciwoci konieczne jest przesunicie linii DDP_CBindex {) oraz DDX_CBindex () z wntrza makra AFX_DATA_MAP na zewntrz w celu dokonania modyfikacji. Dziki temu mona samemu modyfikowa te pozycje. Oddzielanie linii w celu zaimple-mentowania funkcji DDP_CBindex () oraz DDX_CBindex () zwykle nie jest konieczne, jednak byo jedynym rozwizaniem w naszym konkretnym przypadku.
Gdy usuwasz linie DDP_CBindex {} i DDX_CBindex () z wntrza makr MFC, reprezentowane przez nie zmienne skadowe nie pojawi si w oknie dialogowym ClassWizarda, a ClassWizard nie bdzie mg nimi automatycznie zarzdza.