Microsoft KB Archive/231591

= How to use a dialog template to create an MFC dialog that contains an ActiveX control =

Article ID: 231591

Article Last Modified on 11/21/2006

-

APPLIES TO

 Microsoft Foundation Class Library 4.2, when used with:  Microsoft Visual C++ 4.2 Enterprise Edition

 Microsoft Visual C++ 5.0 Enterprise Edition

 Microsoft Visual C++ 6.0 Enterprise Edition

 Microsoft Visual C++ 4.2 Professional Edition</li></ul>

 Microsoft Visual C++ 5.0 Professional Edition</li></ul>

 Microsoft Visual C++ 6.0 Professional Edition</li></ul>

 Microsoft Visual C++ 6.0 Standard Edition</li></ul>

 Microsoft Visual C++ .NET 2002 Standard Edition</li></ul>

 Microsoft Visual C++ .NET 2003 Standard Edition</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q231591

<div class="notice_section">

Note Microsoft Visual C++ .NET 2002 and Microsoft Visual C++ .NET 2003 support both the managed code model that is provided by the Microsoft .NET Framework and the unmanaged native Microsoft Windows code model. The information in this article applies only to unmanaged Visual C++ code.

<div class="summary_section">

SUMMARY
It is possible to display a dialog from either a DIALOG resource or from a dialog template in memory. In the latter case, the dialog template is either constructed or loaded into memory and the dialog is created indirectly.

Dialogs that contain ActiveX controls are more difficult to create indirectly because they require additional information such as license keys and the initial states of properties. MFC requires that this additional information be provided as a DLGINIT resource. The Visual C++ resource editor creates this DLGINIT resource in the resource (.rc) file for each dialog containing an ActiveX control.

Both CDialog::CreateIndirect and CDialog::InitModalIndirect support using DLGINIT resources with dialog templates in memory. However, the DLGINIT parameter is not documented and by default is set to NULL. The complete prototypes for these functions are: BOOL CDialog::CreateIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd, void* lpDialogInit, HINSTANCE hInst);

BOOL CDialog::InitModalIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd = NULL,void* lpDialogInit = NULL); Note Only the versions of these functions which take a LPCDLGTEMPLATE as the first parameter support passing a DLGINIT resource. The versions which take a HGLOBAL parameter do not support DLGINIT resources.

<div class="moreinformation_section">

MORE INFORMATION
The following source shows how to load a DIALOG resource from memory and display it indirectly using a dialog template in memory. This function also uses the DLGINIT resource and will work with DIALOG resources that contain ActiveX controls. void CMainFrame::OnMyModalDialogIndirect {   //Load DLGTEMPLATE DLGTEMPLATE* pTemplate; HINSTANCE hInst= AfxFindResourceHandle(                           MAKEINTRESOURCE(IDD_INDIRECT),RT_DIALOG); if (hInst == NULL) {        TRACE("Cound not find resource in resource chain"); ASSERT(FALSE); return; }   HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(IDD_INDIRECT),        RT_DIALOG); ASSERT(hRsrc != NULL);

HGLOBAL hTemplate = ::LoadResource(hInst, hRsrc); ASSERT(hTemplate != NULL); pTemplate = (DLGTEMPLATE*)::LockResource(hTemplate);

//Load coresponding DLGINIT resource void* lpDlgInit = NULL; HGLOBAL hDlgInit = NULL;

HRSRC hsDlgInit = ::FindResource(hInst, MAKEINTRESOURCE(IDD_INDIRECT),                            RT_DLGINIT); if (hsDlgInit != NULL) {       // load it        hDlgInit = ::LoadResource(hInst, hsDlgInit); ASSERT(hDlgInit != NULL);

// lock it       lpDlgInit = ::LockResource(hDlgInit); ASSERT(lpDlgInit != NULL); }

//ToDo: Modify DLGTEMPLATE in memory if desired

CDialog dlg; dlg.InitModalIndirect(pTemplate, NULL, lpDlgInit); dlg.DoModal; ::UnlockResource(hTemplate); ::FreeResource(hTemplate); if (hDlgInit) {       ::UnlockResource(hDlgInit); ::FreeResource(hDlgInit); }  }

Additional query words: CreateDialogIndirect

Keywords: kbinfo kbcontainer kbctrl kbdlg kbhowto kbresource KB231591

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.