VC6中使用CHtmlView在对话框控制中显示HTML文件

2016-01-29 11:51 106 1 收藏

VC6中使用CHtmlView在对话框控制中显示HTML文件,VC6中使用CHtmlView在对话框控制中显示HTML文件

【 tulaoshi.com - C语言心得技巧 】

VC6中使用CHtmlView在对话框控制中显示HTML文件


             编译/赵湘宁

     

本文的例子程序


   在Visual Studio 6.0中出现了一个新类CHtmlView,利用这个类,我们可以实现在对话框的控制中显示HTML文件。           要想使用CHtmlView类,对它的定义和实现就必须有全面深入的理解。我们不妨拿CHtmlView和CListView做一个比较,通过比较这两个类,我们会发现一些有趣的差别。首先,MFC中CListView有一个对应的CListCtrl类,而CHtmlView却没有一个CHtmlCtrl类与之对应;其次,CListView的使用依赖于MFC的文档/视结构,而CHtmlView的实现是基于COM的。通过IWebBrowser2接口来实现,而且IWebBrowser2与MFC文档/视图结构之间没有任何关系。
     为了实现在对话框的控制中显示HTML文件,我们也可以为CHtmlView创建一个对应的类CHtmlCtrl。以下是类CHtmlCtrl程序源代码:
        创建一个静态控制(也可以是其他控制),这个控制的ID及大小位置与界面上的控制相同。

BOOL CHtmlCtrl::CreateFromStatic(UINT nID, CWnd* pParent){    CStatic wndStatic;    if (!wndStatic.SubclassDlgItem(nID, pParent))    return FALSE;    // 获取静态控制的矩形区域并转换为父窗口的客户区坐标    CRect rc;    wndStatic.GetWindowRect(&rc);    pParent-ScreenToClient(&rc);    wndStatic.DestroyWindow();    // 创建 HTML 控制 (CHtmlView)    return     Create(NULL,                    // 类名        NULL,                    // 标题        (WS_CHILD | WS_VISIBLE ), // 风格        rc, // 矩形区域        pParent,          // /父窗口        nID,  // 控制 ID        NULL);          ///框架/文档}

   为了避免主控程序将CHtmlView对象看作是文档/视图框架,需要重载,CView::OnMouseActivate和CView::OnDestroy。此外,当用户在控制中单击时,OnMouseActivate要负责响应(WM_MOUSEACTIVATE)。  

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)
int CHtmlCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT msg){//旁路 CView 文档/框架return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, msg);}void CHtmlCtrl::OnDestroy(){if (m_pBrowserApp) {     m_pBrowserApp-Release();       m_pBrowserApp = NULL;}CWnd::OnDestroy(); // 旁路 CView 文档/框架}

  通常,CHtmlView是在virtual void PostNcDestroy()中释放空间,但对话框中的控制常常是作为堆栈对象实现的,所以,在PostNcDestroy()中不必在做什么。      

     virtual void PostNcDestroy() {  }

     为了实现“app:” 伪协议,重载导航处理器OnBeforeNavigate2()。传递“app:”链接到一个虚拟协议处理器。因为app:是假协议,所以在浏览起重要取消掉这个导航。  

     void CHtmlCtrl::OnBeforeNavigate2( LPCTSTR lpszURL,    DWORD nFlags,     LPCTSTR lpszTargetFrameName,     CByteArray& baPostedData,     LPCTSTR lpszHeaders,     BOOL* pbCancel ){       const char APP_PROTOCOL[] = "app:";        int len = _tcslen(APP_PROTOCOL);        if (_tcsnicmp(lpszURL, APP_PROTOCOL, len)==0)        {          OnAppCmd(lpszURL + len);          *pbCancel = TRUE;        }}

              重载OnAppCmd(),处理app:命令,当浏览器准备导航到“app:foo”时,这个函数被调用,参数lpszWhere的值为“foo”。  

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)
void CHtmlCtrl::OnAppCmd(LPCTSTR lpszWhere){ // default: do nothing}

                  重载OnMouseActivate, OnDestroy, 和 PostNcDestroy以后,CHtrmlCtrl在对话框中就可以象个控制一样工作。详细的使用方法请参见例子程序:AboutHtml。        运行AboutHtml.exe,并打开About对话框……音乐多么美妙!更有趣的是程序所用到的HTML源文件、图像、声音等文件都作为资源存储在EXE文件中:        

// in AboutHtml.rc ABOUT.HTM  HTML DISCARDABLE "resabout.htm" PD.JPG     HTML DISCARDABLE "respd.jpg" OKUP.GIF   HTML DISCARDABLE "resokup.gif" OKDN.GIF   HTML DISCARDABLE "resokdn.gif" MOZART.WAV HTML DISCARDABLE "resmozart.wav"

              注意:用文件的实际名字作为资源名很重要,以便浏览器能够找到他们。在一个普通的Web页面中,我们使用图像是用下列语法:      


        此代码假设图像文件"pd.jpg"存

来源:https://www.tulaoshi.com/n/20160129/1483620.html

延伸阅读
方法一: 在对话框DOMODAL()之前调用CWinAPP中的SetDialogBkColor成员函数,其中第一个参数设置背景色,第二个参数设置字体颜色,但只能对所有的对话框统一设置,不能针对某一个指定的对话框 方法二: 重载OnPaint(),即WM_PAINT消息,加入代码: CRect rect; GetClientRect(&rect); dc.FillSolidRect(rect,RGB(0,255,0)); 方法三: 重...
1、意图 有时候我们希望将非模态窗口显示为模态窗口。比如在IE的“文件”菜单下选择“打印”,弹出的“打印”对话框就是非模态的(也许我们不太清楚Microsoft的设计意图,一般来说这里的“打印”对话框应该是模态的)。这种情况下如何将“打印”对话框显示为模态的呢(这个对话框对我们来说是Black Box)? 2、简单实现 简单...
标签: 电脑入门
通过WPS文字的页面设置对话框我们可以设置文档的页边距、布局、分栏等。一般情况下,我们可以通过单击文件菜单选择页面设置命令来打开它。次数多了这样操作起来有些烦琐,有没有简单的方法呢?答案是肯定的。 方法如下: 方法一:在垂直标尺的任何地方双击可以显示页面设置对话框。 方法二:如果你想通过双击水平标尺来显示页面设置对话框...
void CXXXDlg::OnSize(UINT nType, int cx, int cy) {  CDialog::OnSize(nType, cx, cy);    // TODO: Add your message handler code here  CRect            rectDlg;    CPaintDC     dc(this);     Get...
在用VC开发应用程序时,经常会要做一些可以改变大小的对话框,而这个时候就要求对话框上的控件会随着对话框大小的改变而改变自己的位置和大小。如果控件比较少,那可以在对话框的OnSize()事件里面添加代码,通过计算来调整各个控件的位置和大小;但是,如果对话框上的控件比较多的话,那这将是一件非常痛苦的事情!要是程序中又有很多可以...

经验教程

331

收藏

77
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部