15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Return value from PropertySheet::DoModal() non-wizard mode

Bryan McKay -- Bryan_McKay@msn.com
Wednesday, November 13, 1996

Environment:  VC++ 4.0, NT 4.0


Return values are normally:
	0 (Close [X} box selected), IDOK and IDCANCEL

Problem:  If you are using data validation in DataExchange, and the validation 

fails (ie. calls pDX->Fail() ), then you select the close [X} button, the 
value returned by PropertySheet::DoModal() is IDOK, even though the property 
page still contains invalid data.

The problem seems to revolve around CWnd::m_nModalResult in that this value is 

set by the dialog procedure before the DataExchange function is called, and if 

the pDX->Fail() function is called, the dialog box is resumed, without first 
clearing CWnd::m_nModalResult.  After selecting the close [X} button, whatever 

the current value of CWnd::m_nModalResult is is returned by 
PropertySheet::DoModal()

A workaround I have come up with to avoid modifing the MFC source code is to 
create two member functions for the PropertySheet, namly 
"SaveAndClearModalResult()" and "RestoreModalResult()", which save and restore 

the value of CWnd::m_nModalResult into a private variable, then within the 
DataExchange function

... DatExchange(...)
{
	m_pPointerToPropSheet->SaveAndClearModalResult();

	... DDX & DDV stuff goes here ...

	m_pPointerToPropSheet->RestoreModalResult();
}

thus, if the "pDX->Fail()" function is called (causing an exception), the 
CWnd::m_nModalResult will remain at 0, until DDV passes, and the OK or CANCEL 
button is selected.

Although I havn't tested this for regular dialog boxes yet, I am assuming it 
applies to them as well.


A second anomaly with property sheets seems to be when you call the 
SetWizardButtons function, when you arn't in wizard mode -- it has no effect 
(as it shouldn't), except for changing the default button to Cancel instead of 

ok (which I don't like, but I suppose it could be considered a feature for 
certain circumstances)

I discovered this "feature" when I used the same class/page for both tabbed 
dialog and wizard mode (wizard for adding a new "person", tabbed dialog for 
editing)



Just thought everyone would like to know,

Bryan.


P.S.  While I'm on the topic of CPropertyPage, does anyone know a quick and 
dirty way of setting the focus to the tab itself instead of the first control 
on the tab?



Robert G. -- COBBRG@dmdceds.med.osd.mil
Friday, November 15, 1996


You can obtain the tab control by using the resource ID which is declared   
in afxres.h as AFX_IDC_TAB_CONTROL.

example from within a CPropertyPage derived class:
CWnd *tab = GetParent()->GetDlgItem(AFX_IDC_TAB_CONTROL);
ASSERT(tab);
tab->SetFocus();

I have occasion to put the tab control at the top of the Z-order using   
SetWindowPos; however, I have experienced a "side effect" that causes a   
list control to disappear if it was previously the first control on the   
page with the WS_TABSTOP style.  Anybody had experience with this   
phenomenon?

Good Luck,
 -Rob

 ----------
From:  Bryan McKay
Sent:   1996 Nov 13 03:43
To:  mfc-l@netcom.com
Subject:  RE: Return value from PropertySheet::DoModal() non-wizard mode

Environment:  VC++ 4.0, NT 4.0



P.S.  While I'm on the topic of CPropertyPage, does anyone know a quick   
and
dirty way of setting the focus to the tab itself instead of the first   
control
on the tab?





| Вернуться в корень Архива |