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






4.81/5 (32投票s)
2003 年 8 月 9 日
3分钟阅读

164941

1341
VS.NET 包含一个未文档化的 DLL 库,名为 HTMLLITE...
引言
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_NOTIFY
的 lParam
包含指向 NMHDR
结构的指针,并且像任何其他控件一样,成员没有区别... hwndFrom
、idFrom
和代码。
“代码”是最重要的一个,所以我开始了解每个代码的含义,并提出了以下内容
//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
是否有效 - 它们不起作用。
请在下面的部分中发表评论,以便我们可以填补这个特定领域的空白。