您的位置: 首页 >> 文章首页 >> 网络编程 >> .Net专区 >> 运用COM技术 -- 实现HTML对话框
搜 索 发布软件 文章投搞 说明






分类列表
4ASP技术
4.Net专区
4数据库类

运用COM技术 -- 实现HTML对话框
作者: 来源: 时间:2004-6-14 16:48:11

COM技术是现在时下最热门的技术之一,经常被使用在网络编程中。它可以被用户Server端,也可以被下载到用户端。下面介绍一种方法,可以在用户端打开一个HTML对话框。读者可以通过下面的例子学习COM的使用。


 在安装了IE4或IE5后,将会系统目录(windows\system)下安装一个叫MSHTML.DLL的文件。这个动态链接库的引出函数中ShowHTMLDialog来显示一个HTML对话框。但是这个函数需要一些COM要索。下面这个类是对整个功能的封装。(如果读者有兴趣的话,可以使用Visual Studio 6.0中带的Depend来观察MSHTML的引入函数,其中还有模式和非模式的区别,可以尝试使用。)


 class CHtmlDialog


 {


 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();


 CHtmlDialog(LPCTSTR lpszURL, BOOL bRes = FALSE, CWnd* pParent = NULL);


 CHtmlDialog (UINT nResID, CWnd* pParent = NULL);


 CHtmlDialog ( );


 virtual ~ CHtmlDialog( );


  


 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;


 };  


 // CHtmlDialog类的实现文件.  


 CHtmlDialog :: CHtmlDialog ()


 {


 TRACE0("Warning: Initialization may not be done: Non Functional contructor");


 }


 CHtmlDialog::~ CHtmlDialog()


 {


 //释放Mshtml.dll


 ::FreeLibrary(m_hInstMSHTML);


 }


 CHtmlDialog:: CHtmlDialog(UINT nResID, CWnd* pParent/*= NULL*/)


 {


 m_hWndParent = pParent ? pParent->GetSafeHwnd() : NULL;


 CString strTemp;


 strTemp.Format("%d", nResID);


 ResourceToURL(strTemp);


 CommonConstruct();


 }  


 CHtmlDialog::CHtmlDialog(LPCTSTR lpszURL, BOOL bRes, CWnd* pParent/*= NULL*/)


 {


 m_hWndParent = pParent ? pParent->GetSafeHwnd() : NULL;


 if (bRes)


 {


 ResourceToURL(lpszURL);


 }


 else


 m_strURL = lpszURL;


 CommonConstruct();


 }


 int CHtmlDialog::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 CHtmlDialog::CommonConstruct()


 {


 m_hInstMSHTML = ::LoadLibrary(TEXT("MSHTML.DLL"));


 }


 inline void CHtmlDialog::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 CHtmlDialog::SetParam(VARIANT *pvarArgs)


 {


 m_varArgs = pvarArgs;


 }


 void CHtmlDialog::SetParam(LPCTSTR lpszArgs)


 {


 m_varArgs = lpszArgs;


 }


 CString CHtmlDialog::GetReturnString()


 {


 ASSERT(m_varReturn.vt == VT_BSTR);


 CString str = m_varReturn.bstrVal;


 return str;


 }


 LPCVARIANT CHtmlDialog::GetReturnVariant()


 {


 return (LPCVARIANT)m_varReturn;


 }


 void CHtmlDialog::SetSize(int x, int y)


 {


 m_strOptions.Format("dialogWidth: %d; dialogHeight: %d", x, y);


 }  


 void CHtmlDialog::SetDlgOptions(LPCTSTR lpszOptions)


 {


 m_strOptions = lpszOptions;


 }  


 使用CHtmlDialog的一个简单例子  


 比如我们要在一个关于对话框里使用这个类,我们所要做工作是写一个HTML文件并把它以IDR_ABOUT_HTM包含进资源文件里。这里列出OnAppAbout的函数如下:


 void CHDDemoApp::OnAppAbout()


 {


 CHtmlDialog dlg(IDR_ABOUT_HTM, AfxGetMainWnd());


 dlg.DoModal();


 }


 还可以利用构造函数传递字符串资源或要显示的URLs,通过使用HTML中的图形和声音资源就可以在关于对话框中显示一个复杂的效果。

向对话框中传递参数


 在有些时候我们不仅仅要显示一个HTML资源,还要从应用程序中向关于对话框传递一些参数进去(比如:产品序列号,许可号等),参数类型可以是string类型,也可以是variant类型,比如我们要在对话框显示产品序列号、用户名称、公司名称和产品的版本号,可以在程序添加如下代码:


 void CHDDemoApp::OnDemoParam1()


 {


 CHtmlDialog dlg(IDR_ABOUT1_HTM, AfxGetMainWnd());


 CString str = m_strProductID //产品序列号


 + ";"+ m_strUserName //用户许可号


 + ";" + m_strCompanyName //公司名称


 + ";" + m_strAppVersion;//版本号


 dlg.SetParam(str);


 dlg.DoModal( );


 }


 在实际显示的HTML主页中我们还必须包含一些javascript或vbscript函数。在HTML中传给CHtmlDialog的任何参数都可以作为window对象的dialogArguments属性,以javascript为例:


 function getParameters( )


 {


 var args = new Array();


 args = window.dialogArguments.split(";"); //Now display in the document


 Productid.innerText = args[0];


 UserName.innerText = args[1];


 CompanyName.innerText = args[2];


 AppVersion.innerText = args[3];


  


 }


   


 从对话框中获取返回值  


 我们已经发现通过结合使用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中使用下列标签来设置的:


   在ChtmlDialog中提供了一个设置对话框尺寸的简单的方法,这种方法无须在HTML的标签中指定尺寸的大小,而只需调用函数SetDialogSize(int nWidth, int nHeight)即可;还有一个函数也可以用来设置尺寸的大小,也就是SetOptions(LPCTSTR lpszOptions),字符串lpszOptions的格式是“dialogWidth: xxx; dialogHeight: xxx”,关于更详细使用方法请参看Internet Client SDK函数ShowModalDialog的描述。 
上一篇文章:最佳ASP.NET编程习惯
下一篇文章:
相关文章:
首 页广告联系本站声明下载帮助发布软件访客留言关于我们
© CopyRight 2002-2004, 软件518下载站(破解资源下载基地) www.rj518.com, Inc. All Rights ReservedPowered by
明日互联提供空间及带宽
绵IDC备00274号