使用 CDHtmlDialog 和 SetWindowRgn 实现带 HTML 界面的对话框






4.83/5 (13投票s)
2004年10月21日
3分钟阅读

200540

5853
描述如何使用外部 HTML 页面作为对话框的非矩形皮肤。
图 1 带有 HTML 界面的演示对话框
引言
此程序演示了如何使用 CDHtmlDialog
和 SetWindowRgn
函数为对话框赋予非矩形 HTML 皮肤。如果您熟悉 HTML,那么处理精美的皮肤将比其他方法更快。这个想法来源于文章 "Gimme Some Skin... VideoSkins",但我使用了 CDHtmlDialog
代替。CodeProject 上有一篇同作者的文章“Create Skins from Ordinary Web Pages”,但我现在无法访问。
希望对您有所帮助。我在 Win98/Win2000/Win2003 和 IE6 SP1 下测试了我的示例。
使用代码
您需要更改以下项目,以使对话框成为您自己的
- 外部 HTML 文件 _Html_Skin.htm 的内容。
- GIF 蒙版图像。
- HtmlSkinDlg.cpp 文件中的 HTML 事件处理程序。
特点
- 非矩形皮肤对话框。
- 一个外部 HTML 页面中的三个皮肤。
- 浏览器控件的一些不希望出现的行为已被禁止。
- 上下文菜单仅在编辑控件中可用。
- 文本选择仅在编辑控件中可用。
- 不允许拖放文件。但是您可以在编辑控件之间拖放文本。
- 所有功能键 F1-F12 和 Escape 键均无效。
- Ctrl-P 打印被禁用。
- 用户无法按 Ctrl-N 为当前 URL 打开新的浏览器窗口。
- 除非将鼠标拖动到滚动条或编辑控件内,否则您将在 UI 的任何地方拖动整个窗口。
- 在 Win2000 中,矩形拖动边框始终与整个窗口的当前大小匹配。
- 在 Win2000/XP/2003 中,使用 16 位或更高颜色时,窗口可以设置为透明。
- 当系统主题更改时,布局几乎不变。
对比图 2a 和 2b,图 3a 和 3b,您可以注意到,滚动条的宽度是在两种不同主题下相同皮肤的唯一细微差别。
图 2a Luna 皮肤,Windows 经典主题。
图 2b Luna 皮肤,超大字体主题。
图 3a WebFX 皮肤,Windows 经典主题。
图 3b WebFX 皮肤,超大字体主题。
缺陷
- 我在示例中使用的 HTML 页面需要 IE5.5+。
- "WinClassic" 皮肤仅适用于系统的 Windows 经典主题。
- 此示例仅支持外部页面。如果您想将 HTML 页面和图像放入资源中,请参考我的另一篇文章:带 CSS、JavaScript 和图像的 CDHtmlDialog。
- 加载带有精美图像和布局的 HTML 页面可能需要很长时间,因此您也许可以在皮肤页面加载之前添加一个闪屏。参考这篇文章:CSplashScreenEx。
关注点
- 拖放目标可能会弄乱页面。
在对话框的
OnInitDialog()
成员中,我通过如下方式禁止了拖放文件操作//refuse dragging file into this dialog m_pBrowserApp->put_RegisterAsDropTarget(VARIANT_FALSE);
但是,当我尝试将文件拖放到对话框中时,当鼠标指针经过边框时,内容会被弄乱。我注意到关键在于 HTML body 的边距。在 HTML 页面中,必须添加以下内容以避免混乱
<STYLE type=text/css> ... BODY { ... MARGIN-BOTTOM: 0px; MARGIN-RIGHT: 0px; ... } ... </STYLE>
OnDocumentComplete
的第一次调用不是针对您的外部 HTML 页面。第一个是针对程序资源中的内部 HTML 页面,所以您可以像这样检查
void CHtmlSkinDlg::OnDocumentComplete(LPDISPATCH , LPCTSTR szUrl) { CString sUrl=szUrl; sUrl.MakeLower(); if( sUrl != _sDestUrl ) { //OnDocumentComplete for built-in resource or other URLs, //not for your external page //... } else { //OnDocumentComplete for your external page //... } }
历史
2004 年 10 月 25 日
版本 1.0.0.2
- [文章] 图片、文本和 zip 文件已全部更新。
- [源代码] 添加了宏
DHTML_EVENT_TAG_ALL
。 - [源代码] 修复了一些禁用加速器的缺陷。编辑控件内的行为现在正常。
- [源代码] 使用类
CLayeredWindowHelperST
使窗口透明。 - [源代码] 使用 GIF 代替 BMP 以减小文件大小。
2004 年 10 月 20 日
版本 1.0.0.1,初始发布。
顺便说一句
:) 这是我在 CodeProject 上的第二篇文章。欢迎访问我的主页 iTreeSoft。