【问题标题】:How to properly change tabs on CPropertySheet如何正确更改 CPropertySheet 上的选项卡
【发布时间】:2015-03-16 13:11:35
【问题描述】:

我有一个带有三个选项卡的 CPropertySheet。每个选项卡都有一个不同的 CPropertyPage 类。当我的 CPropertySheet 与调试器一起加载时,第一页总是正确显示。但是,当我单击任何其他选项卡时,CPropertyPage 区域变为空白。即使我单击第一个选项卡,该区域仍然是空的。我正在使用 Visual Studio、MFC、C++。

我正在尝试找到正确的方法来处理不同的标签点击并让我的标签正确显示。这是初始化我的属性表及其页面的代码:

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;

这是我的 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 );

【问题讨论】:

  • 如果页面有显示问题,很可能是在您没有显示的实际页面的代码中。特别是因为您说第一页第一次正确显示。
  • 您知道我是否需要在我的页面中进行特殊活动吗?我正在尝试了解如何使用OnSetActive
  • OnSetActive 仅当您想在页面变为活动状态时增加/覆盖基本处理时才需要。您通常会在页面显示之前执行一些额外的处理。
  • 那么 CPropertSheet 应该自动处理页面更改吗?我已经用我的一个简单页面的代码更新了我的代码。
  • 如果我将它作为我的第一页,我添加的示例页面会正确显示。单击任何选项卡,都会删除所有内容。谢谢@rrrower

标签: c++ tabs mfc cpropertysheet


【解决方案1】:

我的问题是我将 m_bModeless 设置为 false,

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多