最近在写一个小软件,想在MFC对话框中显示帮助文档,都是html格式的,上网找了好多资料,用一个CHtmlCtrl类的东西,但是网上找的这个类放在VS2005下编译不过去,老是提示错误。于是几经修改,可以使用,下面贴代码(环境:Win7 + VS2005 SP1):

头文件:

#pragma once #include <afxhtml.h> #include <atlsafe.h> // 该结构在命令映射中定义一个入口,这个映射将文本串映射到命令IDs, // 如果命令映射中有一个映射到 ID_APP_ABOUT 的入口 “about”,并且 // HTML 有一个链接锚 ,那么单击该链接时将执行 struct HTMLCMDMAP { LPCTSTR name; int nID; };// command name used in "app:name" HREF in //这个类将 CHtmlView 转换为普通的能在对话框和框架中使用的控制 class CHtmlCtrl : public CHtmlView { DECLARE_DYNCREATE(CHtmlCtrl) public: CHtmlCtrl():m_bHideMenu(FALSE), m_cmdmap(NULL){}; // protected constructor used by dynamic creation virtual ~CHtmlCtrl(){}; HTMLCMDMAP* m_cmdmap;// command map BOOL m_bHideMenu;// hide context menu // get/set HideContextMenu property BOOL GetHideContextMenu(){ return m_bHideMenu; } void SetHideContextMenu(BOOL val){ m_bHideMenu=val; } // Set doc contents from string HRESULT SetHTML(LPCTSTR strHTML); // set command map void SetCmdMap(HTMLCMDMAP* val){ m_cmdmap = val; } // create control in same place as static control BOOL CreateFromStatic(UINT nID, CWnd* pParent); // create control from scratch BOOL Create(const RECT& rc, CWnd* pParent, UINT nID,DWORD dwStyle = WS_CHILD|WS_VISIBLE,CCreateContext* pContext = NULL) { return CHtmlView::Create(NULL, NULL, dwStyle, rc, pParent,nID, pContext); } // 重写该函数可以截获子窗口消息,从而禁用上下文菜单。 virtual BOOL PreTranslateMessage(MSG* pMsg); // 通常,CHtmlView 自己是在 PostNcDestroy 销毁的,但对于一个界面控制来说 // 我们不想那样做,因为控制一般都是作为另一个窗口对象的成员实现的。 virtual void PostNcDestroy(){} // 重写以便旁路掉对 MFC doc/view 框架的依赖,CHtmView 仅仅在这里依附于框架。 afx_msg void OnDestroy(); afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest,UINT msg); // 重写以便截获 "app:" 伪协议 virtual void OnBeforeNavigate2( LPCTSTR lpszURL,DWORD nFlags,LPCTSTR lpszTargetFrameName,CByteArray& baPostedData,LPCTSTR lpszHeaders,BOOL* pbCancel ); // 你可以重写处理 "app:" 命令的代码。注意只是在不使用命令映射机制时才需要重写 virtual void OnAppCmd(LPCTSTR lpszCmd); DECLARE_MESSAGE_MAP(); };

源文件:

// CHtmlCtrl 实现 -- 控件中的 web 浏览器,只要改写 CHtmlVie
// 你就可以摆脱框架 - 从而将此控制用于对话框和其它任何窗口。
//
// 特性s:
// - SetCmdMap 用于设置“app:command”链接的命令映射。.
// - SetHTML 用于将字符串转换为 HTML 文档。.
#include "StdAfx.h"
#include "HtmlCtrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// macro to declare a typedef for ATL smart poitners; eg SPIHTMLDocument2
#define DECLARE_SMARTPTR(ifacename) typedef CComQIPtr<ifacename> SP##ifacename;
// smart pointer to IHTMLDocument2
DECLARE_SMARTPTR(IHTMLDocument2)
// useful macro for checking HRESULTs
#define HRCHECK(x) hr = x; if (!SUCCEEDED(hr)) { /
TRACE(_T("hr=%p/n"),hr);/
return hr;/
}
IMPLEMENT_DYNAMIC(CHtmlCtrl, CHtmlView)
BEGIN_MESSAGE_MAP(CHtmlCtrl, CHtmlView)
ON_WM_DESTROY()
ON_WM_MOUSEACTIVATE()
END_MESSAGE_MAP()
//
// Create control in same position as an existing static control with given
// the same ID (could be any kind of control, really)
//
BOOL CHtmlCtrl::CreateFromStatic(UINT nID, CWnd* pParent)
{
CStatic wndStatic;
if (!wndStatic.SubclassDlgItem(nID, pParent))
return FALSE;
// Get static control rect, convert to parent's client coords.
CRect rc;
wndStatic.GetWindowRect(&rc);
pParent->ScreenToClient(&rc);
wndStatic.DestroyWindow();
return Create(rc, pParent, nID);
}
// Override to avoid CView stuff that assumes a frame.
//
void CHtmlCtrl::OnDestroy()
{
m_pBrowserApp = NULL; // will call Release
CWnd::OnDestroy();  // bypass CView doc/frame stuff
}
// Override to avoid CView stuff that assumes a frame.
//
int CHtmlCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT msg)
{
// bypass CView doc/frame stuff
return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, msg);
}
// Return TRUE iff hwnd is internet explorer window.
inline BOOL IsIEWindow(HWND hwnd)
{
static LPCSTR IEWNDCLASSNAME = "Internet Explorer_Server";
char classname[32]; // always char, never TCHAR
GetClassName(hwnd, (LPSTR)classname, sizeof(classname));
return strcmp(classname, IEWNDCLASSNAME)==0;
}
//
// Override to trap "Internet Explorer_Server" window context menu messages.
//
BOOL CHtmlCtrl::PreTranslateMessage(MSG* pMsg)
{
if (m_bHideMenu)
{
switch (pMsg->message)
{
case WM_CONTEXTMENU:
case WM_RBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK:
if (IsIEWindow(pMsg->hwnd))
{
if (pMsg->message==WM_RBUTTONUP)
// let parent handle context menu
GetParent()->SendMessage(WM_CONTEXTMENU, pMsg->wParam, pMsg->lParam);
return TRUE; // eat it
}
}
}
return CHtmlView::PreTranslateMessage(pMsg);
}
//
// Override to pass "app:" links to virtual fn instead of browser.
//
void CHtmlCtrl::OnBeforeNavigate2( LPCTSTR lpszURL,
DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData,
LPCTSTR lpszHeaders, BOOL* pbCancel )
{
LPCTSTR APP_PROTOCOL = _T("app:");
int len = (int)_tcslen(APP_PROTOCOL);
if (_tcsnicmp(lpszURL, APP_PROTOCOL, len)==0)
{
OnAppCmd(lpszURL + len);    // call virtual handler fn
*pbCancel = TRUE;       // cancel navigation
}
}
//
// Called when the browser attempts to navigate to "app:foo". Default handler
// searches command map for "foo" command, and sends parent a WM_COMMAND
// message with the ID if found. Call SetCmdMap to set the command map. Only
// override OnAppCmd if you want to do something more complex.
//
void CHtmlCtrl::OnAppCmd(LPCTSTR lpszCmd)
{
if (m_cmdmap)
{
for (int i=0; m_cmdmap[i].name; i++)
{
if (_tcsicmp(lpszCmd, m_cmdmap[i].name) == 0)
// Use PostMessage to avoid problems with exit command. (Let
// browser finish navigation before issuing command.)
GetParent()->PostMessage(WM_COMMAND, m_cmdmap[i].nID);
}
}
}
//
// Set document contents from string
//
HRESULT CHtmlCtrl::SetHTML(LPCTSTR strHTML)
{
HRESULT hr;
// Get document object
SPIHTMLDocument2 doc = GetHtmlDocument();
// Create string as one-element BSTR safe array for IHTMLDocument2::write.
CComSafeArray<VARIANT> sar;
sar.Create(1,0);
sar[0] = CComBSTR(strHTML);
// open doc and write
LPDISPATCH lpdRet;
HRCHECK(doc->open(CComBSTR("text/html"),
CComVariant(CComBSTR("_self")),
CComVariant(CComBSTR("")),
CComVariant((bool)1),
&lpdRet));
HRCHECK(doc->write(sar)); // write contents to doc
HRCHECK(doc->close());  // close
lpdRet->Release();   // release IDispatch returned
return S_OK;
}

使用方法,在自己的对话框上拖进来一个static,然后修改一下ID为IDC_STATIC_HELP,然后在对话框的初始化函数,也就是OnInitDialog()中添加下面代码,注意下面的m_html是一个类成员变量,定义在头文件中 ,CHtmlCtrl m_html; :

BOOL CHelpDialog::OnInitDialog()
{
CDialog::OnInitDialog();
m_html.SetHideContextMenu(TRUE);
m_html.CreateFromStatic(IDC_STATIC_HELP,this);
m_html.Navigate(m_strUrl);
//CString m_Text = " 李民录 ";
//m_html.SetHTML(m_strUrl);

    return TRUE;  // 除非将焦点设置到控件,否则返回TRUE
}

至此,调用你的对话框,就可以看到效果了。

如果你想直接显示html文本的话,可以这样写:

m_html.SetHideContextMenu(TRUE);
m_html.CreateFromStatic(IDC_STATIC_HELP,this);
m_html.Navigate("about:blank");  //这句话一定要写

CString m_Text = 李民录liminlu0314@163.com> ";
m_html.SetHTML(m_Text );"

运行效果图

HTML文档

在MFC对话框中显示html网页相关推荐

  1. MFC对话框中显示图片的四种方法

    先分类如下: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一个基于对话框的工程,名为T ...

  2. 在MFC对话框中显示图片的三种方法(有两种使用OpenCv)

    最近写了一个用对话框显示图片的程序,这里将学习到的东西整理一下: 编程环境:VC6.0+OpenCv1.0 准备工作:用VC6.0生成一个对话框外壳(全被采用默认设置),然后在对话框中添加一个静态控件 ...

  3. 在mfc对话框中添加一个显示网页的窗口

    现在只能实现在对话框内显示一个网页文件,,但如果点击网页文件中的某个链接的话,,却还是在IE中进行打开的,,正在想如何始终在该对话框内完成.. 希望各位大神能指点.. 这个要用到 ActiveX 控件 ...

  4. MFC对话框中添加工具栏

    1. 在资源管理器中添加 ToolBar资源,资源 ID为 IDR_TOOLBAR1 加入两个工具栏按钮 2. 在对话框头文件 XxxDlg.h中添加工具栏变量 CToolBar m_toolBar; ...

  5. 用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转)

    用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转) 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://hcq11.blogbus.com/logs/5 ...

  6. MFC对话框中的OnCancel方法

    MFC对话框中的OnCancel虚拟方法在如下三个时机被调用: 1.对话框按IDCANCEL按钮,直接通过CDialog的ON_COMMAND(IDCANCEL, &CDialog::OnCa ...

  7. CAD二次开发-MFC对话框domal显示错误

    问题:CAD二次开发时添加MFC对话框后显示错误,显示为多重引线样式管理器. 解决:在对话框之前需要使用AfxGetResourceHandle和AfxSetResourceHandle进行模块资源切 ...

  8. mfc 内嵌 本地html,MFC程序中内嵌网页,附示例工程

    最近在课程设计,因为小悠太懒了,是在不想用C++完成一些简单的文件上传下载操作,于是就想着将网页内嵌到程序中,上传下载神马的就直接使用网页Web来完成就好了,本示例中将演示在MFC程序中内嵌一个htm ...

  9. 我的VC++——对话框中显示GIF格式的图片

    PictureEx图片显示类支持以下格式的图片:GIF (including animated GIF87a and GIF89a), JPEG, BMP, WMF, ICO, CUR等,我特别推崇的 ...

最新文章

  1. python读音发音器-python3-文本读音器
  2. 这是我的第一个python程序怎么打-我的第一个Python程序
  3. 详解IIS中URL重写工具的规则条件(Rule conditions)
  4. (十)装饰器模式详解(与IO不解的情缘)
  5. JDBC基础学习(三)—处理BLOB类型数据
  6. Farseer.Net ORM开源框架 V0.x 教程目录
  7. Python时间库—datetime的详解及使用
  8. [BZOJ 4300]绝世好题
  9. 国内搜索大哥iOS面试题
  10. Python中的抽象超类
  11. 离地球近的星星,远离情况怎样?
  12. kindle书籍的后缀名_kindle可以看什么格式
  13. 系统状态空间模型c语言,【单选题】能完全描述系统动态行为的数学模型是() A. 传递函数 B. 微分方程 C. 状态 空间表...
  14. 百度bae部署java项目
  15. 洛谷P2689 东南西北
  16. PAT_乙级_1003_筱筱
  17. 备份iphoneXR手机照片
  18. 浅谈——服务器虚拟化超融合存储
  19. 用原生js实现移动端图片轮播
  20. 我大三创业拿到 7 位数投资奇特生活

热门文章

  1. Car-like Robot运动参数分析
  2. 开源linux 二进制工具,谷歌开源二进制文件对比工具 BinDiff
  3. python api接口调用_python 调用有道api接口的方法
  4. vue.js中使用微信扫一扫,解决invalid signature问题
  5. oracle 导出01455,使用exp命令导出报EXP-00008 和ORA-01455的解决方法
  6. halcon 仿射变换和区域跟随
  7. MIT 6.824 学习笔记(一)--- RPC 详解
  8. ap.net core 教程(三)
  9. 云存储是否能拯救数据泛滥
  10. 【PowerShell】PS中 the fuck 插件(PoShFuck)将 wtf 搜索引擎从 Google 改为 Baidu 或者 Bing