2015-03-16 3 views
1

J'ai une CPropertySheet avec trois onglets. J'ai une classe CPropertyPage différente pour chaque onglet. Lorsque mon CPropertySheet est chargé avec le débogueur, la première page est toujours affichée correctement. Toutefois, lorsque je clique sur l'un des autres onglets, la zone CPropertyPage devient vide. Même si je clique sur le premier onglet, la zone est toujours vide. J'utilise Visual Studio, MFC, C++.Comment modifier correctement les onglets sur CPropertySheet

J'essaie de trouver la bonne façon de gérer les différents clics de l'onglet et mes onglets montrent correctement. Voici le code pour initialiser ma feuille de propriétés et ses pages:

BOOL CSLIMOptCplusplusApp::InitInstance() 
{ 
CWinApp::InitInstance(); 
SQLHENV m_1; 
EnvGetHandle(m_1); 

Login lgn; //Creates a Login dialog for the user to enter credentials. 
lgn.DoModal(); 

CImageSheet*  imagedlg = new CImageSheet("Admin Options"); 
CImageDisplay* pageImageDisplay = new CImageDisplay; 
CImageDimensions* pageImageDimensions = new CImageDimensions; 
ListOption*  pageListOption  = new ListOption; 

ASSERT(imagedlg); 
ASSERT(pageImageDisplay); 
ASSERT(pageImageDimensions); 
ASSERT(pageListOption); 

imagedlg->AddPage(pageListOption); 
imagedlg->AddPage(pageImageDisplay); 
imagedlg->AddPage(pageImageDimensions); 

imagedlg->m_psh.dwFlags |= PSH_NOAPPLYNOW; //Removes the default Apply button 
imagedlg->Create(); 
imagedlg->ShowWindow(SW_SHOW); 
m_pMainWnd = imagedlg; 

C'est le code de ma classe CPropertySheet:

BOOL CImageSheet::OnInitDialog() 
{ 
CWnd* pOKButton = GetDlgItem(IDOK); 
ASSERT(pOKButton); 
pOKButton->ShowWindow(SW_HIDE); 

CWnd* pCANCELButton = GetDlgItem(IDCANCEL); 
ASSERT(pCANCELButton); 
pCANCELButton->ShowWindow(SW_HIDE); 

// Set Flags for property sheet 
m_bModeless = TRUE; 
m_nFlags  |= WF_CONTINUEMODAL; 


BOOL bResult = CPropertySheet::OnInitDialog(); 
m_bModeless = FALSE; 
m_nFlags  &= ~WF_CONTINUEMODAL; 

//Get button sizes and positions 
CRect rect, tabrect; 
GetDlgItem(IDOK)->GetWindowRect(rect); 
GetTabControl()->GetWindowRect(tabrect); 

ScreenToClient(rect); 
ScreenToClient(tabrect); 

UpdateData(FALSE); 

Merci pour toute aide!

EDIT:

Voici le code pour une simple page que je veux montrer.

// ImageDisplay.cpp : implementation file 
// 

#include "stdafx.h" 
#include "SLIMOptCplusplus.h" 
#include "ImageDisplay.h" 
#include "afxdialogex.h" 
#include "ListOption.h" 

// CImageDisplay dialog 

char g_emailProfile[255]; 

IMPLEMENT_DYNAMIC(CImageDisplay, CPropertyPage) 

CImageDisplay::CImageDisplay() 
: CPropertyPage(CImageDisplay::IDD) 
, m_EmailProfile(_T(g_emailProfile)) 
{ 

} 

CImageDisplay::~CImageDisplay() 
{ 
} 

void CImageDisplay::DoDataExchange(CDataExchange* pDX) 
{ 
CPropertyPage::DoDataExchange(pDX); 
DDX_Text(pDX, TXTC_EMAIL_PROFILE, m_EmailProfile); 
} 


BEGIN_MESSAGE_MAP(CImageDisplay, CPropertyPage) 
END_MESSAGE_MAP() 


// CImageDisplay message handlers 
+0

S'il y a un problème d'affichage des pages, le plus probable est dans le code de la page réelle que vous ne l'avez pas montré . D'autant plus que vous dites que la première page s'affiche correctement la première fois. – rrirower

+0

Savez-vous si j'ai besoin d'un événement spécial dont j'ai besoin dans mes pages? J'essaie de comprendre comment utiliser 'OnSetActive'. –

+0

OnSetActive est requis uniquement lorsque vous souhaitez augmenter/remplacer le traitement de base lorsque la page est active. Vous devez généralement effectuer un traitement supplémentaire dont la page a besoin avant de l'afficher. – rrirower

Répondre

1

Mon problème était que je mettais m_bModeless false,

BOOL bResult = CPropertySheet::OnInitDialog(); 
m_bModeless = FALSE; //Change to TRUE to fix the problem. 
m_nFlags  &= ~WF_CONTINUEMODAL;