CPropertySheet in CDialog
Rogas -- rogas@ip.krakow.pl Tuesday, October 01, 1996 Hello, Environment: VC++4.2, Win 95 I have a problem. I put a modeless CPropertySheet to a modal CDialog. There is an CEdit control on the dialog, some buttons and the CPropertySheet as a child of the dialog. Property pages are set up as Help says they should be. It works fine, until I focus one of controls on one of property pages on the sheet, and switch to another application. I cant get the focus on this dialog again, and it hangs (has also problems with redrawing). I spied it and it came out that the sheet falls into an endless loop { WM_GETDLGOCODE WM_SETDLGCODE } When I focus the dialog before switching to another application, there are no such problems. Has anybody done such thing? Here is part of the code of dialog: CNiveauChargementDialog::CNiveauChargementDialog(CWnd* pParent *=NULL*/) : CDialog(CNiveauChargementDialog::IDD, pParent) { m_PSheet = new CNiveauChargementPSheet("Sheet", this); } CNiveauChargementDialog::~CNiveauChargementDialog() { delete m_PSheet; } BOOL CNiveauChargementDialog::OnInitDialog() { CDialog::OnInitDialog(); m_PSheet->AddPage(&m_Vent); m_PSheet->AddPage(&m_Autres); CRect rectPSheet; m_PSheet->Create(this, WS_CHILD | WS_VISIBLE ); m_PSheet->GetClientRect(&rectPSheet); m_PSheet->MoveWindow(7, 24, rectPSheet.right, rectPSheet.bottom, FALSE); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } Thanks in advance Rogas
IK 23 -- Cunningham@tgd.swissptt.ch Thursday, October 03, 1996 [Mini-digest: 3 responses] This was on the list quite a while ago I include the note that Niels Ull Jacobsen sent out. regards I found the following in my Usenet clippings (posted by "Alice" - I lost the rest of her name).=20 It may help you. Basically, you need to give your sheet the WS_EX_CONTROLPARENT style. -- snatched from usenet. > Unpublished article from Microsoft: > --------------------------------------------------------------------- >=20 > Subject: > Date: > Fri, 1 Mar 96 09:11:28 TZ > From: > Sergey Zarembsky (Stream)> To: > mplante@versus.com >=20 > .TITLE: Child CPropertySheet Hangs If Focus Is Switched > .VERSION(S): 4.00 > .OPERATING SYSTEM(S):WINDOWS NT >=20 > = ----------------------------------------------------------------------- > The information in this article applies to: >=20 > - The Microsoft Foundation Classes (MFC), included with: > Microsoft Visual C++, 32-bit Edition, version 4.0 > = ----------------------------------------------------------------------- >=20 > SYMPTOMS > =3D=3D=3D=3D=3D=3D=3D=3D >=20 > If a CPropertySheet is a child of a CDialog or another CPropertySheet, > and focus is placed in a control inside the child CPropertySheet, when > you switch focus to another window, the program will hang. The program > will also hang if focus is on a control and you close the sheet. The > child CPropertySheet continually gets a WM_GETDLGCODE. >=20 > CAUSE > =3D=3D=3D=3D=3D >=20 > By default, CPropertyPages will have a style of WS_EX_CONTROLPARENT. > CPropertySheets will not have this style. This style allows a user to > tab from a control inside the page to one in the sheet. >=20 > When focus is switched from the parent sheet, code which handles > default push 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, GetNextTabItem() is not able to find > controls inside the child CPropertySheet since it doesn't have a style > of WS_EX_CONTROLPARENT. The loop never ends because it never finds = the > original control that had focus. >=20 > RESOLUTION > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >=20 > Override OnInitDialog() for the child CPropertySheet and add the > WS_EX_CONTROLPARENT style. >=20 > STATUS > =3D=3D=3D=3D=3D=3D >=20 > Microsoft has confirmed this to be a bug in the Microsoft products > listed at the beginning of this article. We are researching this bug > and will post new information here in the Microsoft Knowledge Base as > it becomes available. >=20 > MORE INFORMATION > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >=20 > REFERENCES > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >=20 > Sample Code > ----------- >=20 > // CMySheet is derived from CPropertySheet > BOOL CMySheet::OnInitDialog() > { > ModifyStyleEx (0, WS_EX_CONTROLPARENT); >=20 > return CPropertySheet::OnInitDialog(); > } >=20 > /* Compile options needed: default >=20 > This article might help you! > >Michael L. Thal >Data Tree Corporation >voice: (619) 231-3300 >fax: (619) 231-3301 > > > > Niels Ull Jacobsen, Kr=FCger A/S nuj@kruger.dk Graham Cunningham 00 41 31 338 0633 >---------- >From: Rogas[SMTP:rogas@ip.krakow.pl] >Sent: Dienstag, 1. Oktober 1996 11:16 >To: mfc-l@netcom.com >Subject: CPropertySheet in CDialog > >Hello, > >Environment: VC++4.2, Win 95 > >I have a problem. I put a modeless CPropertySheet to a modal CDialog. >There is an CEdit control on the dialog, some buttons and the >CPropertySheet as a child of the dialog. Property pages are set up as >Help says they should be. > >It works fine, until I focus one of controls on one of property pages >on >the sheet, and switch to another application. I cant get the focus on >this dialog again, and it hangs (has also problems with redrawing). >I spied it and it came out that the sheet falls into an endless loop >{ >WM_GETDLGOCODE >WM_SETDLGCODE >} > >When I focus the dialog before switching to another application, there >are no such problems. > >Has anybody done such thing? > >Here is part of the code of dialog: > >CNiveauChargementDialog::CNiveauChargementDialog(CWnd* pParent >*=3DNULL*/) > : CDialog(CNiveauChargementDialog::IDD, pParent) >{ > m_PSheet =3D new CNiveauChargementPSheet("Sheet", this); >=09 >} > > >CNiveauChargementDialog::~CNiveauChargementDialog() >{ > delete m_PSheet; >} > > > >BOOL CNiveauChargementDialog::OnInitDialog()=20 >{ > CDialog::OnInitDialog(); > > m_PSheet->AddPage(&m_Vent); > m_PSheet->AddPage(&m_Autres); > >=09 > > CRect rectPSheet; >=09 > m_PSheet->Create(this, WS_CHILD | WS_VISIBLE ); > m_PSheet->GetClientRect(&rectPSheet); > m_PSheet->MoveWindow(7, > 24, > rectPSheet.right, > rectPSheet.bottom, > FALSE); > // TODO: Add extra initialization here >=20 > return TRUE; // return TRUE unless you set the focus to a control > // EXCEPTION: OCX Property Pages should return FALSE >} > >Thanks in advance > >Rogas > -----From: Andi Giri Hello Embedding a CPropertySheet object in a CDialog has been dealt with in the book,Visual C++ 4 MasterClass, by WROX Press. The authors have a CDialogExtension class derived from CDialog, where they embed a property page. Andi -----From: Jim Hudson I ran into the same thing. Thank Gosh for Spy++, use ModifyStyleEx(0, WS_EX_CONTROLPARENT); to change the property sheet style and that should make it work quite nicely for you. Later Jim Hudson
| Вернуться в корень Архива |