PRB: Child CPropertySheet Hangs If Focus Is Switched (149501)
The information in this article applies to:
- The Microsoft Foundation Classes (MFC)
- Microsoft Visual C++ 4.0a
This article was previously published under Q149501 SYMPTOMS
If a modeless CPropertySheet is a child of a CDialog or another
CPropertySheet, the program will hang in the following situations:
- The focus is switched back to a PropertyPage that previously had the
focus.
- The focus is placed on a control on a PropertyPage, and then the focus
is switched to another window (for example, Program Manager).
- The focus is on a control on a PropertyPage and the PropertySheet is
closed.
The program hangs because the child CPropertySheet continuously receives a
WM_GETDLGCODE message.
CAUSE
By default, CPropertyPages have a WS_EX_CONTROLPARENT style. However,
CPropertySheets do not have this style. This style allows a user to press
the TAB key to move from a control inside the page to one in the sheet.
When the focus is switched from the CPropertyPage, code that handles
default command buttons loops through all the controls in the pages and the
sheet. Cycling through controls is done using GetNextDlgTabItem(). The loop
cycles through controls in the page in the child CPropertySheet and finds
its way to controls in the parent page or parent dialog. At this point,
GetNextDlgTabItem() is not able to find controls inside the child
CPropertySheet because it doesn't have a WS_EX_CONTROLPARENT style. The
loop never ends because it never finds the original control that had the
focus.
RESOLUTION
Override OnInitDialog() for the child CPropertySheet, and add the
WS_EX_CONTROLPARENT style.
STATUS
This is a problem with the implementation of the Property Sheet common
control, and not MFC's CPropertySheet wrapper.
Modification Type: | Major | Last Reviewed: | 10/24/2003 |
---|
Keywords: | kbprb kbPropSheet KbUIDesign KB149501 |
---|
|