65.9K
CodeProject 正在变化。 阅读更多。
Home

HOWTO:使用未文档化的 HTMLLITE.DLL 组件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (32投票s)

2003 年 8 月 9 日

3分钟阅读

viewsIcon

164941

downloadIcon

1341

VS.NET 包含一个未文档化的 DLL 库,名为 HTMLLITE...

Sample Image - htmllite.gif

引言

VS.NET 的安装程序中使用了一个未文档化的 DLL 组件,它允许您为您的应用程序渲染 HTML,并且这一切都来自一个简单的窗口类。

该控件允许您在应用程序中渲染,例如,格式丰富的报告并将其显示给用户。

该库位于\Program Files\Microsoft Visual Studio .NET 2003\Setup\Visual Studio .NET Enterprise Architect 2003 - English,文件名为:htmllite.dll (136 Kb)。

您必须从此处复制 DLL 并将其与从 ZIP 存档中提取的其他源代码和可执行文件一起放置。 该 DLL 没有包含在 ZIP 中,因为重新分发的原因。

如何使用 HTMLLITE

该库非常易于使用。 您首先需要调用一个子程序别名

RegisterHtmlLiteClass

... 这将使窗口类准备好在您的应用程序中使用(类似于调用 InitCommonControls)。

然后可以使用 CreateWindowEx 创建控件,就像任何其他窗口一样

CreateWindowEx(WS_EX_CONTROLPARENT, "HTMLLITE", 
   "TODO: HTML goes here...", WS_CHILD | WS_VISIBLE, 
   10, 10, 500, 500, hWnd, 0, 0, 0);

然后控件就可以在您的父窗口上显示和使用了。

幕后

几周前,当我第一次开始使用 HTMLLITE 时,我花了几个小时在名为 Spy++ 的古老实用程序上查看 HTMLLITE 使用的消息...

我发现 HTMLLITE 的工作方式与标准 Windows 常用控件(例如 ListView)非常相似。 它使用 WM_NOTIFY 向您的应用程序发送有关鼠标点击、移动和其他事件的通知。

WM_NOTIFYlParam 包含指向 NMHDR 结构的指针,并且像任何其他控件一样,成员没有区别... hwndFromidFrom 和代码。

“代码”是最重要的一个,所以我开始了解每个代码的含义,并提出了以下内容

//HTMLLITE Notify Codes

//A link has been clicked either via
//... the Mouse or Spacebar key
#define HTMLLITE_CODE_LEFTCLICK    1000 
//A link has received focus due to 
//... the Tab Cycle, or Keyboard Arrow Keys
#define HTMLLITE_CODE_TABCYCLE  1001 
//A link has been right-clicked, and already had focus
#define HTMLLITE_CODE_RIGHTCLICK   1003 
//Mouse is over a link
#define HTMLLITE_CODE_MOUSEOVER    1004 
//Mouse is hovering a link (~1 second = hover)
#define HTMLLITE_CODE_MOUSEHOVER   1005 
//Mouse has left a link's rectangle
#define HTMLLITE_CODE_MOUSEEXIT    1006 

很简单。

该控件还将其窗口文本/标题用作 HTML 的来源。 因此,如果您想在创建 HTML 内容后更改它,只需发送一条包含新 HTML 的 WM_SETTEXT 消息即可。

下一步是找到一种方法来确定在任何给定的 HTMLLITE 控件实例中单击了哪个超链接。 幸运的是,几天前,我偶然发现了关于 SYSLINK 控件(Common Controls v6 中的新控件)的 MSDN 页面。 SYSLINK 控件类似于 HTMLLITE,但它只能渲染简单的 <a href> 样式标记。 我尝试了 SYSLINK 控件的通知结构,看看 HTMLLITE 是否使用了类似的东西...并且...天哪,它确实使用了

typedef struct tagNMLINK { //nm structure for SYSLINK
    NMHDR hdr;
    LITEM item;
} NMLINK, *PNMLINK;

大约半小时后,我逆向了整个 HTMLLITE NM 结构...

最重要的成员是 linkid。 此成员包含在 <a href="..."> 样式标记中使用的参数 linkid 的值。 因此,如果您的 HTMLLITE 控件中有多于一个链接,只需将 linkid 参数添加到您的 <a> 中,它们将被填充到以下结构的同名成员中。

typedef struct NMHTMLLITE {
  //The Window Handle (hWnd) of the HTMLLITE control
  //... sending you this message.
  DWORD hwndFrom;      
  //If your HTMLLITE control is on a dialog, this member
  //... contains its Dialog ID.
  DWORD idFrom;
  //As defined below. As an example, this member will
  //... equal HTMLLITE_CODE_LEFTCLICK when a Link has
  //... been Left-clicked.                      
  DWORD code;  
  //When you create a Link with <a href="..." linkid=xxx>
  //... the linkid parameter is filled in this member.
  //.. allowing you to know which link has been clicked
  //... in your HTMLLITE control and then perform a specific action.
  DWORD linkid; 
  //This is a RECT structure which contains the coord's and
  //... dimensions of the Link concerned.      
  RECT  linkrc; 
} NMHTMLLITE, *LPNMHTMLLITE;

易如反掌。

HTML 实现的范围?

说实话,我不确定。 我知道它似乎使用了类似 CSS 的 HTML,但它不是真正的 W3C 质量 :)

以下是 MS .NET 应用程序使用的一些标记,因此您会知道我知道多少

<p highlight=#003399 padding-left=20 padding-top=14 padding-bottom=14>
<font face="arial" size=12pt color="white"><b>Microsoft®</b></font>
<br><font face="arial" size=22pt color="white">Visual Studio® .NET Setup
</font></p>
<p align="right"><a color=#3F4F7F HOVER-COLOR=#C3120C linkid=211>
<b>Text goes here</b></a></p>

今天早些时候,我检查了 Table 是否有效 - 它们不起作用。

请在下面的部分中发表评论,以便我们可以填补这个特定领域的空白。

© . All rights reserved.