这里为您提供两种最主流、最可靠的方法:

vc 在窗体对话框中打开html网页
(图片来源网络,侵删)
  1. 使用 MFC 的 CHtmlView 类(推荐,最简单)

    • CHtmlView 是 MFC 对 Internet Explorer WebBrowser 控件的封装,它继承自 CView,所以使用起来非常方便,几乎和操作普通视图一样。
    • 优点:代码量少,集成简单,功能强大(可以响应网页中的链接、按钮等事件)。
    • 缺点:依赖于 IE 内核,在系统没有安装 IE 或 IE 模块被禁用的情况下可能无法工作。
  2. 使用 ATL/WTL 的 CAxWindowIAWebBrowser2 接口(更灵活,现代)

    • 这种方法使用 ActiveX 容器功能来承载 WebBrowser 控件,它更底层,但提供了更大的灵活性,并且是 ATL/WTL 框架的标准做法。
    • 优点:灵活性高,不局限于 MFC 的文档/视图结构,可以在任何对话框窗口中使用。
    • 缺点:代码相对复杂一些,需要处理 COM 接口。

使用 MFC 的 CHtmlView 类(最推荐)

这是最简单、最符合 MFC 设计思想的方法,我们将创建一个基于对话框的应用,并将其主视图类型从 CDialog 改为 CHtmlView

步骤 1:创建基于对话框的 MFC 项目

  1. 打开 Visual Studio,创建一个新的 MFC 应用程序项目。
  2. 在应用程序类型向导中,选择 “基于对话框”
  3. 其他选项保持默认,点击“完成”。

步骤 2:修改主对话框类以继承自 CHtmlView

  1. “解决方案资源管理器” 中,找到并打开你的主对话框头文件(通常是 项目名Dlg.h)。

    vc 在窗体对话框中打开html网页
    (图片来源网络,侵删)
  2. 将对话框类的基类从 CDialogEx 修改为 CHtmlView

    // 项目名Dlg.h
    #pragma once
    // class C项目名Dlg : public CDialogEx  <-- 旧代码
    class C项目名Dlg : public CHtmlView  // <-- 新代码
    {
        // ... 其他代码不变 ...
    };
  3. 打开对应的实现文件(项目名Dlg.cpp)。

  4. C项目名Dlg::C项目名Dlg(CWnd* pParent /*=nullptr*/) 构造函数中,将 IDD_项目名_DIALOG 改为 AFX_IDW_PANE_MAIN,这是 CHtmlView 期望的主窗口 ID。

    // 项目名Dlg.cpp
    C项目名Dlg::C项目名Dlg(CWnd* pParent /*=nullptr*/)
        : CHtmlView(IDD_项目名_DIALOG) // <-- 旧代码可能是 CDialogEx(IDD_项目名_DIALOG)
    {
        // ... 其他代码不变 ...
    }

    注意:更标准的做法是创建一个单文档界面 应用,然后在 CMainFrame 中使用 CHtmlView,但对于简单的对话框需求,直接修改主对话框类是可行的。

    vc 在窗体对话框中打开html网页
    (图片来源网络,侵删)

步骤 3:在 OnInitDialog 中导航到网页

  1. 打开 项目名Dlg.cpp 文件。

  2. 找到 C项目名Dlg::OnInitDialog() 函数。

  3. 在函数末尾,调用 Navigate2 方法来加载一个网页,这个方法必须在视图窗口创建之后调用。

    // 项目名Dlg.cpp
    BOOL C项目名Dlg::OnInitDialog()
    {
        CHtmlView::OnInitDialog(); // <-- 重要:调用基类的 OnInitDialog
        // 设置对话框标题(可选)
        SetIcon(m_hIcon, TRUE);
        SetIcon(m_hIcon, FALSE);
        // TODO: 在此添加额外的初始化代码
        // 关键:在视图创建后,调用 Navigate2 打开网页
        // Navigate2 的参数可以是 URL 字符串或一个结构体
        Navigate2(_T("https://www.baidu.com"), 0, NULL);
        // Navigate2(_T("C:\\MyPath\\MyLocalPage.html"), 0, NULL); // 也可以打开本地文件
        return TRUE;  // return TRUE  unless you set the focus to a control
    }

步骤 4:添加必要的库链接

为了让 CHtmlView 正常工作,你的项目需要链接一些额外的库。

  1. “解决方案资源管理器” 中右键点击你的项目,选择 “属性”

  2. “配置属性” -> “链接器” -> “输入” 中,找到 “附加依赖项”

  3. 在列表中添加以下库:

    • aximp.exe (这是一个工具,不是库,见下文)
    • shlwapi.lib
    • mshtml.lib
    • urlmon.lib

    aximp.exeCHtmlView 依赖于 shdocvw.dll (IE 的核心 DLL),在较新的 Windows SDK 中,你可能需要运行 aximp.exe 工具为这个 DLL 生成 .NET 互操作程序集,以便 VC++ 能更好地使用它,MFC 项目设置会自动处理大部分依赖,但如果遇到链接错误,可能需要手动运行此工具。

步骤 5:编译并运行

F5 编译并运行你的程序,你应该会看到一个窗口,它看起来像一个简单的浏览器,并自动加载了百度首页。


使用 CAxWindowIAWebBrowser2 接口(更灵活)

如果你不想改变对话框的基类,或者你的项目结构更复杂,这个方法更合适。

步骤 1:创建基于对话框的 MFC 项目

同方法一,创建一个“基于对话框”的 MFC 项目。

步骤 2:在对话框资源上添加一个“ActiveX 控件”

  1. 打开对话框编辑器(.rc 文件)。
  2. 打开 “工具箱” (View -> Toolbox)。
  3. 右键点击工具箱的标题,选择 “选择项...” (Choose Items...)
  4. 在弹出的对话框中,切换到 “COM 组件” 选项卡。
  5. 在列表中找到并勾选 “Microsoft Web 浏览器” (Microsoft Web Browser),然后点击“确定”。
  6. 从工具箱中拖拽 “WebBrowser” 控件到你的对话框上,它会显示为一个地球图标。

步骤 3:为 WebBrowser 控件添加变量

  1. 右键点击你刚添加的 WebBrowser 控件,选择 “添加变量...” (Add Variable...)
  2. “添加成员变量向导” 中:
    • 类别:选择 “Control”
    • 变量类型:它会自动识别为 CAxWindow,这就是我们将用来操作控件的变量。
    • 变量名:给它一个名字,m_WebBrowser
    • 点击“完成”。

步骤 4:在代码中操作浏览器

  1. 打开你的对话框头文件(项目名Dlg.h),确保包含了必要的头文件。

    // 项目名Dlg.h
    #pragma once
    #include <atlbase.h>      // 包含 CComPtr
    #include <atlhost.h>      // 包含 CAxWindow
    class C项目名Dlg : public CDialogEx
    {
        // ...
    protected:
        CAxWindow m_WebBrowser; // 我们刚刚添加的变量
    // ...
    };
  2. 打开对话框的实现文件(项目名Dlg.cpp)。

  3. OnInitDialog 函数中,通过 GetDlgItem 获取控件窗口,并将其与我们的 CAxWindow 变量关联起来,通过 IAWebBrowser2 接口来导航。

    // 项目名Dlg.cpp
    #include "mshtml.h"      // IAWebBrowser2 接口定义的头文件
    #include "atlbase.h"     // CComPtr 智能指针
    BOOL C项目名Dlg::OnInitDialog()
    {
        CDialogEx::OnInitDialog();
        // ... 其他初始化代码 ...
        // 1. 将 CAxWindow 变量与对话框上的控件关联起来
        m_WebBrowser.Attach(GetDlgItem(IDC_WEBBROWSER1)->m_hWnd); // IDC_WEBBROWSER1 是你的控件的 ID
        // 2. 获取 IAWebBrowser2 接口指针
        CComPtr<IWebBrowser2> spBrowser;
        m_WebBrowser.QueryHost(&spBrowser); // QueryHost 是 CAxWindow 的一个便捷方法
        if (spBrowser)
        {
            // 3. 使用 Navigate2 方法打开网页
            // 第一个参数是 VARIANT 类型的 URL
            CComVariant varUrl(_T("https://www.csdn.net"));
            CComVariant varEmpty;
            spBrowser->Navigate2(varUrl, &varEmpty, &varEmpty, &varEmpty, &varEmpty);
        }
        return TRUE;
    }

步骤 5:添加必要的库链接

同方法一,你需要在项目属性的“链接器”->“输入”中添加:

  • atlthunk.lib (或 atl.lib)
  • shlwapi.lib
  • mshtml.lib
  • urlmon.lib

总结与选择

特性 方法一 (CHtmlView) 方法二 (CAxWindow + IAWebBrowser2)
易用性 非常高,MFC 封装得很好 中等,需要处理 COM 接口
代码量 较多
灵活性 较低,受限于 MFC 视图结构 非常高,可在任何窗口中使用
依赖 IE 内核 IE 内核
推荐场景 快速开发一个简单的浏览器界面,或 MSDI/SDI 应用中需要内嵌网页 复杂对话框,已有 UI 结构,需要精细控制浏览器行为

对于绝大多数在对话框中显示网页的需求,强烈推荐使用方法一 (CHtmlView),因为它最简单、最直接,并且与 MFC 框架结合得最好。