Cómo mostrar un cuadro de diálogo en modo C
La función SHOWHTMLDIALOGFN de mshtml.dll se usa para mostrar un cuadro de diálogo HTML, pero requiere elementos COM para conversiones de cadenas y otras transacciones. Para simplificar todas estas tareas, el autor utiliza una clase para encapsular los elementos COM de la siguiente manera:
Clase CMshtmlDialog
{
Público:
void SetDlgOptions(LPCTSTR lpszOptions);
void SetSize(int x, int y);
variante LPC GetReturnVariant();
cadena cs obtiene cadena de retorno ();
void set param(LPCTSTR lpszArgs);
void set param(VARIANT * pvarArgs);
virtual int DoModal();
CMshtmlDialog(LPCTSTR lpszURL, BOOL bRes = FALSE, CWnd * p padre = NULL);
CMshtmlDialog (UINT nResID, CWnd * p padre = NULL); ();
virtual ~ CMshtmlDialog();
Privado:
recorrido de recursos vacío en línea (LPCTSTR lpszURL); construct();
Protegido:
HWND m_hWndParent
CString m_strOptions
COleVariant m_varArgs, m_varReturn
CString m _ strURL
HINSTANCE m _ hInstMSHTML
};
El archivo de implementación de la clase cmshtmlddialog.
CMshtmlDialog:: CMshtmlDialog()
{
TRACE0("Advertencia: Es posible que la inicialización no se complete: constructor no funcional");
}
CMshtmlDialog:: ~ CMshtmlDialog()
{
//Liberar Mshtml.dll
Biblioteca gratuita ; p>
}
CMshtmlDialog::CMshtmlDialog(UINT nResID, CWnd* pParent/*= NULL*/)
{
m_hWndParent = pParent? p parent-〉GetSafeHwnd(): NULL
CString strTemp
strTemp.
formato(" d ", nResID);
recorrido de recursos(strTemp
construcción común();
}
CMshtmlDialog); ::CMshtmlDialog(LPCTSTR lpszURL, BOOL bRes, CWnd* pParent/*= NULL*/)
{
m_hWndParent = pParent? p parent-〉GetSafeHwnd(): NULL
If (bRes)
{
recurso de recursos(lpszURL);
}
Otros
m _ strURL = lpszURL
construcción común();
}
int CMshtmlDialog: :DoModal()
{
//Primero obtenga el proceso ShowHTMLDialog
SHOWHTMLDIALOGFN * pfnShowHTMLDialog;
pfnshowtmldialog =(SHOWHTMLDIALOGFN *) GetProcAddress (m_hInstMSHTML,TEXT("ShowHTMLDialog"));
If (!pfnShowHTMLDialog)
return-1;
//Ahora crea el apodo de URL
IMoniker * pmk = NULL
BSTR bstrURL = m_strURL. AllocSysString();
CreateURLMoniker(NULL, bstrURL, amppmk);
If (!pmk)
return-1;
TCHAR *poptions = m_options. ¿Está vacío()? NULO: m_strOptions. get buffer(0);
//Ahora muestra el cuadro de diálogo HTML
HRESULT HR =(* pfnshowtmldialog)(m_hwnd parent, pmk, m_varArgs, pchOptions, m_var return );
si (fallo(hora))0
retorno-1;
retorno 0;
}
void CMshtmlDialog::common construct()
{
m_hInstMSHTML =::LoadLibrary(TEXT("MSHTML.
DLL "));
}
CMshtmlDialog vacío en línea::resource tourl(LPCTSTR lpszURL)
{
h instancia h instancia = AfxGetResourceHandle();
ASSERT(hin instancia!= NULL);
LPTSTR lpszModule = new TCHAR[_ MAX _ PATH];
if( GetModuleFileName (instancia hin, lpszModule, _MAX_PATH))
{
m_strURL Format(_T("res://s/s "), lpszModule, lpszURL);
}
Eliminar []módulo lpsz;
}
void CMshtmlDialog::set param(VARIANT * pvarArgs)
{
m _ varArgs = pvarArgs
}
void CMshtmlDialog::set param(LPCTSTR lpszArgs)
{
m _ varArgs = lpszArgs
}
CString CMshtmlDialog::get returnstring()
{
ASSERT(m _ var return . VT == VT _ BSTR);
CString str = m _ var return .
Cadena de retorno;
}
Variante LPC CMshtmlDialog::GetReturnVariant()
{
return(variante LPC)m_var return;
}
void CMshtmlDialog::SetSize(int x, int y)
{
m_strOptions("ancho del diálogo: d; altura del diálogo: d", x, y);
}
void cmshtmdldialog::SetDlgOptions(LPCTSTR lpszOptions)
{
m _ strOptions = lpszOptions
}
Ejemplo sencillo de uso de CMshtmlDialog
Por ejemplo, si queremos utilizar esta clase en el cuadro de diálogo Acerca de, todo lo que tenemos que hacer es escribir un archivo HTML y agregarlo. Está incluido en el archivo de recursos como IDR_ABOUT_HTM. Las funciones de OnAppAbout se enumeran a continuación:
void CHDDemoApp::OnAppAbout()
{
CMshtmlDialog dlg(IDR_ABOUT_HTM, AfxGetMainWnd());
dlg.
DoModal();
}
También puede usar el constructor para pasar un recurso de cadena o URL para mostrar, y puede usar recursos gráficos y de sonido en HTML en el cuadro de diálogo Acerca de Cuadro que muestra efectos complejos.
2007/1019/568011 .shtml