WEB开发网
开发学院软件开发VC 获得 Win32 窗口句柄的更好的方法 阅读

获得 Win32 窗口句柄的更好的方法

 2006-07-19 11:29:08 来源:WEB开发网   
核心提示: 动态生成并显示 HTML 文档前面的例子程序在处理HTML文档时,都是把它作为应用程序的资源进行处理的,获得 Win32 窗口句柄的更好的方法(3),如果碰到需要动态产生HTML文档信息的情况,这种处理方法便无法满足需要,那么至少还得写10-20行无聊的代码,一旦你上手了智能指针,那么如何

动态生成并显示 HTML 文档

前面的例子程序在处理HTML文档时,都是把它作为应用程序的资源进行处理的,如果碰到需要动态产生HTML文档信息的情况,这种处理方法便无法满足需要,那么如何动态 显示生成的HTML文档呢?下面我们就来解决这个问题。

大家知道,将纯文本格式化成HTML是再简单不过的事情了,虽然用C++来实现这个过程有点单调乏味,但仍然是可以做到的。如果你曾经写过JavaScript脚本,那么肯定知道加载页面时 ,可以调用 document.write 直接将HTML写到文档中。其实在C++中做法也一样,只不过编码看起来会有些繁琐和凌乱,因为要用到 COM 接口 IHTMLDocument2 以及 BSTRs、SAFEARRAYs 等数据类型来处理字符串。所幸的是 ATL 具备了大量的类可以助我们一臂之力。

下图是本文例子程序运行时的画面,使用 HTML 文档格式动态显示顶层窗口的信息:

图一 例子程序运行画面

这个程序的代码原型来自第十一期《在线杂志》中“如何禁用HTML页面的上下文菜单” 一文的例子,它实现了一个 HTML “关于”对话框,其显示的HTML页面是从资源中加载的:m_page.LoadFromResource(_T("about.htm"));CHtmlView::LoadFromResource 打开 res://AboutHtml.exe/about.htm,这里“AboutHtml.exe” 是可执行程序的实际名字,“res://”是一个伪协议。为了显示顶层窗口的信息,最好的办法是动态产生 HTML 页面,而不是从资源中加载,为此我在 CHtmlCtrl类中添加了一个新函数:CHtmlCtrl::SetHTML, ////////////////////////////////////
// 通过串设置 HTML 文档内容
//
HRESULT CHtmlCtrl::SetHTML(LPCTSTR strHTML)
{
  HRESULT hr;
  // 获得文档对象
  SPIHTMLDocument2 doc = GetHtmlDocument();
  // 创建只有一个元素(串)的 BSTR 数组元素
  // IHTMLDocument2::write.
  CComSafeArray<VARIANT> sar;
  sar.Create(1,0);
  sar[0] = CComBSTR(strHTML);
  // 打开文档并写入
  LPDISPATCH lpdRet;
  HRCHECK(doc->open(CComBSTR("text/html"),
   CComVariant(CComBSTR("_self")),
   CComVariant(CComBSTR("")),
   CComVariant((bool)1),
   &lpdRet));
 
  HRCHECK(doc->write(sar)); // write contents to doc
  HRCHECK(doc->close());   // close
  lpdRet->Release();     // release IDispatch returned
  return S_OK;
}   
下面我们一步一步来分析实现过程,首先必须获取 IHTMLDocument2 接口: SPIHTMLDocument2 doc = GetHtmlDocument();      SPIHTMLDocument2 与 CComQIPtr<IHTMLDocument2> 一样是一个指向 IHTMLDocument2 的ATL智能指针,(当今 Windows 编程已进入 COM 时代,作为一名编写 Windows 应用程序的开发人员,如果你使用 COM 技术,但没有用过智能指针,那么这段代码会对你有所裨益),接着,必须创建一个SAFEARRAY,以便存放作为 BSTR 数组唯一元素的 HTML 串,SAFEARRAY是一个 COM 数据结构,其作用是在不同平台之间安全地传递数组数据,ATL提供了 CComBSTR 和 CComSafeArray 两个类,为开发人员在处理 BSTRs 和安全数组时减轻了许多痛苦: // strHTML is LPCTSTR
CComSafeArray<VARIANT> sar;
sar.Create(1,0);
sar[0] = CComBSTR(strHTML); 
如果不借助于 CComSafeArray 和 CComBSTR,而是用下列这些 API 函数来实现相同的处理,如 SafeArrayCreateVector,SafeArrayAccessData, 和 SafeArrayUnaccessData,那么至少还得写10-20行无聊的代码。一旦你上手了智能指针,你会觉得ATL的这些东西用起来真的很爽。

上一页  1 2 3 4  下一页

Tags:获得 Win 窗口

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接