AW: Property Sheet in OLE control
IT347 Monday, February 03, 1997 [Mini-digest: 4 responses] Have you tried ensuring that the property sheet has the = WS_EX_CONTROLPARENT style set? There was a bug (might be fixed now) that = = used to screw up the hwnd if focus switched from an propertysheet and = then back again. This was fixed by setting the above style flag hth ---------- Von: Alan J. Livingston=5BSMTP:AlanLivingston=40acm.org=5D Gesendet: Freitag, 31. Januar 1997 18:39 An: mfc-l=40netcom.com Betreff: Property Sheet in OLE control Environment: VC++ 4.2b, Windows95 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D I saw this problem posted on MS's newserver (microsoft.public.vc.mfc), = but never saw a response. I knew it was going to haunt me later. I have an OLE control, created with the control wizard that pops up a property sheet in response to a double click. I use the following code: void CCPropCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) =7B CPropertySheet sheet(=22title=22, this); CPropertyPage page (IDD_PROPPAGE_CPROP); sheet.AddPage(&page); sheet.DoModal(); =7D Now, if I insert this control into the test container and double click on = it the property sheet appears. Then, if I tab to another app and tab back = to this one and click on the OK button to close the proprty sheet, the app = crashes. I've traced through the code and it crashes in CWnd::EnableWindow which = is called from CPropertySheet::DoModal. It appears as if the hWnd of the = safe parent of the control is being munged somehow. Help=21 Has anybody seen = = this? -Alan -----From: "Achyuth Kumar .G S"Hi Alan, I think your main problem is with not checking the return value of 'DoModal()' function. If it is 'IDOK' just return and everything works fine. >achyuth > >Environment: VC++ 4.2b, Windows95 >================================= > > >I saw this problem posted on MS's newserver (microsoft.public.vc.mfc), but >never saw a response. I knew it was going to haunt me later. > >I have an OLE control, created with the control wizard that pops up a >property sheet in response to a double click. I use the following code: > >void CCPropCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) >{ > > CPropertySheet sheet("title", this); > CPropertyPage page (IDD_PROPPAGE_CPROP); > > sheet.AddPage(&page); > sheet.DoModal(); > >} > >Now, if I insert this control into the test container and double click on it >the property sheet appears. Then, if I tab to another app and tab back to >this one and click on the OK button to close the proprty sheet, the app >crashes. > >I've traced through the code and it crashes in CWnd::EnableWindow which is >called from CPropertySheet::DoModal. It appears as if the hWnd of the safe >parent of the control is being munged somehow. Help! Has anybody seen this? > >-Alan > > -----From: "Dunphy, Michael" The HWND of the CWnd * returned by CWnd::GetSafeOwner(m_pParentWnd, &hWndTop); in CPropertySheet::DoModal is not necessarily in the permanent handle map. (It seems like it is in the permanent map if you create a CPropertySheet from an exe, but not when you create one from an OCX). You can work around this problem by deriving a class from CPropertySheet and overriding DoModal(). Here's what we do: int CHOurPropertySheet::DoModal() { //---------------------------------------------------------- // make same call DoModal() makes, so we get the same CWnd* //---------------------------------------------------------- HWND hWndTop; CWnd *pOwner = CWnd::GetSafeOwner(m_pParentWnd, &hWndTop); HWND h = pOwner->GetSafeHwnd(); CWnd cPerm; if (h != NULL) { //----------------------------------- // is the hwnd in the permanent map? //----------------------------------- CWnd *pPerm = CWnd::FromHandlePermanent(h); if (pPerm == NULL) { //--------------------------------------------------------------- // hwnd isn't in the permanent map, so attach the hwnd to a CWnd //--------------------------------------------------------------- cPerm.Attach(pOwner->GetSafeHwnd()); } } int rc = CPropertySheet::DoModal(); //------------------------------------ // if we attached the hwnd, detach it //------------------------------------ if (cPerm.GetSafeHwnd() != NULL) cPerm.Detach(); return rc; } Mike Dunphy Programmer Analyst Honeywell, Inc. AlanLivingston@acm.org wrote: > Environment: VC++ 4.2b, Windows95 > > I saw this problem posted on MS's newserver (microsoft.public.vc.mfc), but > never saw a response. I knew it was going to haunt me later. > I have an OLE control, created with the control wizard that pops up a > property sheet in response to a double click. I use the following code: > void CCPropCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) { > CPropertySheet sheet("title", this); > CPropertyPage page (IDD_PROPPAGE_CPROP); > sheet.AddPage(&page); > sheet.DoModal(); > } > Now, if I insert this control into the test container and double click on it > the property sheet appears. Then, if I tab to another app and tab back to > this one and click on the OK button to close the proprty sheet, the app > crashes. > I've traced through the code and it crashes in CWnd::EnableWindow which is > called from CPropertySheet::DoModal. It appears as if the hWnd of the safe > parent of the control is being munged somehow. Help! Has anybody seen this? -----From: jeremy@omsys.com (Jeremy H. Griffith) On Fri, 31 Jan 1997 12:39:04 -0500, "Alan J. Livingston" wrote: > >Environment: VC++ 4.2b, Windows95 >================================= >I have an OLE control, created with the control wizard that pops up a >property sheet in response to a double click. I use the following code: > >void CCPropCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) >{ > > CPropertySheet sheet("title", this); > CPropertyPage page (IDD_PROPPAGE_CPROP); > > sheet.AddPage(&page); > sheet.DoModal(); > >} > >Now, if I insert this control into the test container and double click on it >the property sheet appears. Then, if I tab to another app and tab back to >this one and click on the OK button to close the proprty sheet, the app crashes. > >I've traced through the code and it crashes in CWnd::EnableWindow which is >called from CPropertySheet::DoModal. It appears as if the hWnd of the safe >parent of the control is being munged somehow. Help! Has anybody seen this? I also have an Ole Control with property pages, and it's a good bit more complicated than that... To begin with, you need to derive your own property page from COlePropertyPage, not CPropertyPage; I used ClassWizard. Actually, you should have gotten the first one for free, from the Control Wizard... I needed to add several more. After you have your derived OlePropertyPage, you need to define a string resource for the property page caption, and plug the ID into the constructor that CW wrote for you (the second arg to the base class ctor): EvGraphPpg::EvGraphPpg() : COlePropertyPage(IDD, IDS_EVGRAPH_PPG_CAPTION) {... In your main control class (derived from COleControl) you'll find lines like this: ///////////////////////////////////////////////////////////////////////////// // Property pages BEGIN_PROPPAGEIDS(EvGraphCtl, 1) PROPPAGEID(EvGraphPpg::guid) END_PROPPAGEIDS(EvGraphCtl) This shows what's needed for one property page; if you have more, add their PROPPAGEIDs too and increase the number in the first line accordingly. The stuff so far is all in the online docs, BTW. (I'm using VC++ 4.0, NT 3.51.) Now, the hard part; to get the prop page to show up from a doubleclick: void EvGraphCtl::OnLButtonDblClk(UINT nFlags, CPoint point) { CWnd* pWnd = GetParent(); if (!pWnd) return; HWND hParent = pWnd->GetSafeHwnd(); if (!hParent) return; OnProperties(NULL, hParent, NULL); Refresh(); } I worked this out through lengthy study of the MFC source... ;-) and it works perfectly well with my control. Sure wish the docs had given *some* clue, though... for a while, I wasn't sure it could be done at all... --Jeremy
Mike Blaszczak -- mikeblas@nwlink.com Tuesday, February 04, 1997 >Von: Alan J. Livingston[SMTP:AlanLivingston@acm.org] >I have an OLE control, created with the control wizard that pops up a >property sheet in response to a double click. I use the following code: >Now, if I insert this control into the test container and double click on it >the property sheet appears. Then, if I tab to another app and tab back to >this one and click on the OK button to close the proprty sheet, the app crashes. This was a bug in MFC, unfortunately. It'll be fixed in the next version. .B ekiM http://www.nwlink.com/~mikeblas/ These words are my own. I do not speak on behalf of Microsoft. This performance was not lip-synched.
| Вернуться в корень Архива |