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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (13投票s)

2004年10月21日

3分钟阅读

viewsIcon

200540

downloadIcon

5853

描述如何使用外部 HTML 页面作为对话框的非矩形皮肤。

图 1 带有 HTML 界面的演示对话框

引言

此程序演示了如何使用 CDHtmlDialogSetWindowRgn 函数为对话框赋予非矩形 HTML 皮肤。如果您熟悉 HTML,那么处理精美的皮肤将比其他方法更快。这个想法来源于文章 "Gimme Some Skin... VideoSkins",但我使用了 CDHtmlDialog 代替。CodeProject 上有一篇同作者的文章“Create Skins from Ordinary Web Pages”,但我现在无法访问。

希望对您有所帮助。我在 Win98/Win2000/Win2003 和 IE6 SP1 下测试了我的示例。

使用代码

您需要更改以下项目,以使对话框成为您自己的

  1. 外部 HTML 文件 _Html_Skin.htm 的内容。
  2. GIF 蒙版图像。
  3. HtmlSkinDlg.cpp 文件中的 HTML 事件处理程序。

特点

  1. 非矩形皮肤对话框。
  2. 一个外部 HTML 页面中的三个皮肤。
  3. 浏览器控件的一些不希望出现的行为已被禁止。
    • 上下文菜单仅在编辑控件中可用。
    • 文本选择仅在编辑控件中可用。
    • 不允许拖放文件。但是您可以在编辑控件之间拖放文本。
    • 所有功能键 F1-F12 和 Escape 键均无效。
    • Ctrl-P 打印被禁用。
    • 用户无法按 Ctrl-N 为当前 URL 打开新的浏览器窗口。
  4. 除非将鼠标拖动到滚动条或编辑控件内,否则您将在 UI 的任何地方拖动整个窗口。
  5. 在 Win2000 中,矩形拖动边框始终与整个窗口的当前大小匹配。
  6. 在 Win2000/XP/2003 中,使用 16 位或更高颜色时,窗口可以设置为透明。
  7. 当系统主题更改时,布局几乎不变。

对比图 2a 和 2b,图 3a 和 3b,您可以注意到,滚动条的宽度是在两种不同主题下相同皮肤的唯一细微差别。

图 2a Luna 皮肤,Windows 经典主题。

图 2b Luna 皮肤,超大字体主题。

图 3a WebFX 皮肤,Windows 经典主题。

图 3b WebFX 皮肤,超大字体主题。

缺陷

  1. 我在示例中使用的 HTML 页面需要 IE5.5+。
  2. "WinClassic" 皮肤仅适用于系统的 Windows 经典主题。
  3. 此示例仅支持外部页面。如果您想将 HTML 页面和图像放入资源中,请参考我的另一篇文章:带 CSS、JavaScript 和图像的 CDHtmlDialog
  4. 加载带有精美图像和布局的 HTML 页面可能需要很长时间,因此您也许可以在皮肤页面加载之前添加一个闪屏。参考这篇文章:CSplashScreenEx

关注点

  1. 拖放目标可能会弄乱页面。

    在对话框的 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>
  2. 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

© . All rights reserved.