用VC实现HTML中模式对话框的显示.doc_第1页
用VC实现HTML中模式对话框的显示.doc_第2页
用VC实现HTML中模式对话框的显示.doc_第3页
用VC实现HTML中模式对话框的显示.doc_第4页
用VC实现HTML中模式对话框的显示.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用VC实现HTML中模式对话框的显示 在Web应用开发中经常会用到带有图象、声音和动画的对话框,然而要在VC+中实现这样一个对话框需要做大量的工作。幸运的是,随着Internet Explorer 4.0的出现以及它所使用的新的技术,所有这些工作无须大量的代码就可实现。一种方法是使用web 浏览器控件,但它并不是最好的方法,尤其是对处理模式对话框时;另外一种方法是使用IE4所引入的HTML模式对话框,它驻留在系统的mshtml.dll这个对HTML进行解释的引擎中。虽然有些功能诸如:单击一个链接,对历史记录的管理以及在同一窗口中装入一个链接在这个模式对话框中不能实现,但对于我们几乎所有的时候仅使用一个模式对话框来说已经足够了。 如何使用HTML中的模式对话框 mshtml.dll中的函数SHOWHTMLDIALOGFN是用来显示一个HTML对话框的,但它需要用于字符串和其它事务转换的COM要素,为了简化所有这些工作,笔者利用一个类来对COM要素进行封装如下: class CMshtmlDialog public: void SetDlgOptions(LPCTSTR lpszOptions); void SetSize(int x, int y); LPCVARIANT GetReturnVariant(); CString GetReturnString(); void SetParam(LPCTSTR lpszArgs); void SetParam(VARIANT* pvarArgs); virtual int DoModal(); CMshtmlDialog(LPCTSTR lpszURL, BOOL bRes = FALSE, CWnd* pParent = NULL); CMshtmlDialog (UINT nResID, CWnd* pParent = NULL); CMshtmlDialog ( ); virtual CMshtmlDialog( ); private: inline void ResourceToURL(LPCTSTR lpszURL); void CommonConstruct(); protected: HWND m_hWndParent; CString m_strOptions; COleVariant m_varArgs, m_varReturn; CString m_strURL; HINSTANCE m_hInstMSHTML; ; / CMshtmlDialog类的实现文件. CMshtmlDialog : CMshtmlDialog () TRACE0(Warning: Initialization may not be done: Non Functional contructor); CMshtmlDialog: CMshtmlDialog() /释放Mshtml.dll :FreeLibrary(m_hInstMSHTML); CMshtmlDialog: CMshtmlDialog(UINT nResID, CWnd* pParent/*= NULL*/) m_hWndParent = pParent ? pParent-GetSafeHwnd() : NULL; CString strTemp; strTemp.Format(%d, nResID); ResourceToURL(strTemp); CommonConstruct(); CMshtmlDialog:CMshtmlDialog(LPCTSTR lpszURL, BOOL bRes, CWnd* pParent/*= NULL*/) m_hWndParent = pParent ? pParent-GetSafeHwnd() : NULL; if (bRes) ResourceToURL(lpszURL); else m_strURL = lpszURL; CommonConstruct(); int CMshtmlDialog:DoModal() /First get the proc ShowHTMLDialog SHOWHTMLDIALOGFN *pfnShowHTMLDialog; pfnShowHTMLDialog = (SHOWHTMLDIALOGFN*)GetProcAddress(m_hInstMSHTML, TEXT(ShowHTMLDialog); if (!pfnShowHTMLDialog) return -1; /Now create a URL Moniker IMoniker* pmk = NULL; BSTR bstrURL = m_strURL.AllocSysString(); CreateURLMoniker(NULL, bstrURL, &pmk); if (!pmk) return -1; TCHAR* pchOptions = m_strOptions.IsEmpty() ? NULL : m_strOptions.GetBuffer(0); /Now show the HTML Dialog HRESULT hr = (*pfnShowHTMLDialog)(m_hWndParent, pmk, m_varArgs, pchOptions, m_varReturn); if (FAILED(hr)0 return -1; return 0; void CMshtmlDialog:CommonConstruct() m_hInstMSHTML = :LoadLibrary(TEXT(MSHTML.DLL); inline void CMshtmlDialog:ResourceToURL(LPCTSTR lpszURL) HINSTANCE hInstance = AfxGetResourceHandle(); ASSERT(hInstance != NULL); LPTSTR lpszModule = new TCHAR_MAX_PATH; if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH) m_strURL.Format(_T(res:/%s/%s), lpszModule, lpszURL); delete lpszModule; void CMshtmlDialog:SetParam(VARIANT *pvarArgs) m_varArgs = pvarArgs; void CMshtmlDialog:SetParam(LPCTSTR lpszArgs) m_varArgs = lpszArgs; CString CMshtmlDialog:GetReturnString() ASSERT(m_varReturn.vt = VT_BSTR); CString str = m_varReturn.bstrVal; return str; LPCVARIANT CMshtmlDialog:GetReturnVariant() return (LPCVARIANT)m_varReturn; void CMshtmlDialog:SetSize(int x, int y) m_strOptions.Format(dialogWidth: %d; dialogHeight: %d, x, y); void CMshtmlDialog:SetDlgOptions(LPCTSTR lpszOptions) m_strOptions = lpszOptions; 使用CMshtmlDialog的一个简单例子 比如我们要在一个关于对话框里使用这个类,我们所要做工作是写一个HTML文件并把它以IDR_ABOUT_HTM包含进资源文件里。这里列出OnAppAbout的函数如下: void CHDDemoApp:OnAppAbout() CMshtmlDialog dlg(IDR_ABOUT_HTM, AfxGetMainWnd(); dlg.DoModal(); 还可以利用构造函数传递字符串资源或要显示的URLs,通过使用HTML中的图形和声音资源就可以在关于对话框中显示一个复杂的效果。 向对话框中传递参数 在有些时候我们不仅仅要显示一个HTML资源,还要从应用程序中向关于对话框传递一些参数进去(比如:产品序列号,许可号等),参数类型可以是string类型,也可以是variant类型,比如我们要在对话框显示产品序列号、用户名称、公司名称和产品的版本号,可以在程序添加如下代码: void CHDDemoApp:OnDemoParam1() CMshtmlDialog dlg(IDR_ABOUT1_HTM, AfxGetMainWnd(); CString str = m_strProductID /产品序列号 + ;+ m_strUserName /用户许可号 + ; + m_strCompanyName /公司名称 + ; + m_strAppVersion;/版本号 dlg.SetParam(str); dlg.DoModal( ); 在实际显示的HTML主页中我们还必须包含一些javascript或vbscript函数。在HTML中传给CMshtmlDialog的任何参数都可以作为window对象的dialogArguments属性,以javascript为例: function getParameters( ) var args = new Array(); args = window.dialogArguments.split(;); /Now display in the document Productid.innerText = args0; UserName.innerText = args1; CompanyName.innerText = args2; AppVersion.innerText = args3; 从对话框中获取返回值 我们已经发现通过结合使用Javascript和C+可以获得更多的信息,那么如何从对话框中传递参数作为我们获得的返回值的结果并传回C+程序呢?作为例子我们还结合Javascript和C+,在利用onunload的处理句柄关闭HTML窗口程序段中我们给出如下的代码: function window_onclose( ) window.returnValue = UserName.value + ; + CompanyName.value; 只需通过设置返回值的属性就可将该值传回C+程序中。返回值可以是任意的variant变量,然后在C+代码中通过调用函数GetReturnString 或GetReturnVariant来处理这个返回值,如: dlg.DoModal( ); /Display the dialog CString str = dlg.GetReturnString( ); /Now handle the return value in whatever way 设置对话框的尺寸 在以上的例子中,对话框尺寸的设置是通过在HTML中使用下列标签来设置的: HTML style=width: 25em; height: 30em 在ChtmlDialog中提供

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论