Hi,
I have a CMyDlgBar CDialogBar-derived object (created by following the
steps in http://support.microsoft.com/kb/185672/en-us). Now I want to
add a CPropertySheet-derived object into it.
If I simply create a CMyPropertySheet class derived from
CPropertySheet and add a m_pMyPropertySheet pointer to this class as a
member variable of CMyDlgBar, the property sheet is displayed
correctly with m_pMyPropertySheet->Create( IDD_PROPERTY_SHEET, this )
in CMyDlgBar::OnInitDialog(...).
Now, rather than programmatically creating the property sheet, I would
like to define it in my dialog bar with the Resource Editor. I've thus
added a IDC_CUSTOM_CTRL Custom Control with the Resource Editor into
my IDD_DIALOGBAR CDlgBar resources and replaced the above Create line
in CMyDlgBar::OnInitDialog(...) with m_pCMyPropertySheet-
SubclassDlgItem( IDC_CUSTOM_CTRL, this ). Doing this leads to a crash
in CMyApp::InitInstance(...) at the line performing the initialization
of the main frame (if ( !pMainFrame || !pMainFrame-
LoadFrame(IDR_MAINFRAME))) generated by the application wizard. The
problem is really in the pMainFrame->LoadFrame(IDR_MAINFRAME)
instruction as the pMainFrame pointer is valid.
This problem is 100% reproduceable and is only due to adding a Custom
Control. You can test it very simply:
- create a MFC MDI application keeping the default settings of the
application wizard
- add a CDialogBar-based object as explained in the URL mentionned at
the beginning of this post
- add a Custom Control in your dialog bar resources with the Resource
Editor
- run the project; it will fail in CYourApp::InitInstance(...).
This is with Visual Studio 2005, I don't know whether this is
important or not. I hope not ;-)
As a workaround, rather than adding a Custom Control in my
IDD_DIALOGBAR CDlgBar resources to define the area I want my property
sheet to be displayed in, I've added a IDC_PICTURE_CTRL Picture
Control. I've then subclassed it as a CMyPropertySheet object in
CMyDialogBar::OnInitDialog(...) with m_pCMyPropertySheet-
SubclassDlgItem( IDC_PICTURE_CTRL, this ). This time, my application
starts up fine, the dialog bar is correctly displayed but the area of
the property sheet is filled in by an empty gray rectangle :-(.
I've noticed that using the "Picture Control/subclass" approach,
CMyPropertySheet::OnInitDialog(...) is never called. By contrast,
using the "no resource/Create" approach goes through
CMyPropertySheet::OnInitDialog(...).
Any suggestion appreciated. Thanks!
placeholder and create my custom control (here property sheet) in its place.