分享
 
 
 

运用COM技术-- 实现HTML对话框

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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的描述。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有