基于文档/视图模式实现网页浏览以及打印功能

这篇博客详细记录了如何使用MFC编程实现基于文档/视图模式的网页浏览和打印功能。主要包括界面拆分、CTopView的URL输入与加载、CWebBrowserDocumentView的网页显示和打印预览,以及隐藏界面为后台进程的操作。通过消息映射和事件处理,成功实现了网页的加载、打印和界面交互。
摘要由CSDN通过智能技术生成

概述

《VC Web打印解决方案概述》这篇博文里面,简单介绍了在windows下html离线、在线网页打印解决方案,针对的是特殊需求。经过好几周的研究终于完整的实现与应用配合进行打印的功能。实际应用的时候没用这种方式,用的是基于对话框模式。
这里记录一下实现的一些功能,权当学习、熟悉一下MFC编程。实现的功能有以下几点:

  • View界面拆分
  • 各界面功能实现
  • 隐藏界面为后台进程

拆分界面

先看一下效果图:
这里写图片描述
就是一个非常简陋的界面,先拆分为两行,然后第二行再拆分为两列。
ComBox控件可输入网址或者从下拉列表里面选择历史记录,从文件菜单打开一个URL之后,会将URL添加到ComBox的下拉列表里面,点击【go】按钮,即可在左下方显示网页内容。粗陋的界面先这样。

粗陋界面拆分实现:
在CMainFrame类里面添加如下定义,用于拆分界面:

    CSplitterWnd m_wndSplitCols;
    CSplitterWnd m_wndSplitRows;

插入两个MFC类,分别为CTopView、CLeftView,基类均为CView,连着新建工程时的view,总共3个view,在CMainFrame类的OnCreateClient方法里面实现窗口的拆分:

// create splitter window
//创建两行一列
if (!m_wndSplitRows.CreateStatic(this, 2, 1))
    return FALSE;
//创建第一行view
if (!m_wndSplitRows.CreateView(0,0,RUNTIME_CLASS(CTopView),CSize(0,20),pContext))
{
    return FALSE;
}
//在第二行创建两列
if (!m_wndSplitCols.CreateStatic(&m_wndSplitRows, 1, 2,WS_CHILD| WS_VISIBLE,m_wndSplitRows.IdFromRowCol(1,0)))
    return FALSE;
//添加view
if (!m_wndSplitCols.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(100, 0), pContext) ||
        !m_wndSplitCols.CreateView(0, 1, RUNTIME_CLASS(CWebBrowserDocumentView), CSize(0, 0), pContext))
{
    m_wndSplitCols.DestroyWindow();
    return FALSE;
}

在CMainFrame类中定义三个view的对象,方便后续使用:

    CWebBrowserDocumentView *pWebView;
    CTopView       *pTopView;
    CLeftView      *pLeftView;

在OnCreateClient方法中赋值如下:

pWebView = (CWebBrowserDocumentView*)this->m_wndSplitCols.GetPane(0,
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MFC的视图打印/预览功能基于CView::OnFilePrint和CView::OnFilePrintPreview这两个函数 如果要对用户自定义对话框(模态)内的子视图(以下简称A视图)进行打印,直接调用A视图的CView::OnFilePrint即可,弹出的“选择打印机”对话框同样也是模态对话框,覆盖在用户对话框上。 如果要对用户对话框内的A视图进行预览,直接调用A视图的CView::OnFilePrintPreview后,预览视图(MFC CPreviewView类实例)内虽然预览正常,但是挡住了用户对话框。由于用户对话框是模态的,导致预览视图上的“打印...”、“上一页”、“下一页”、“放大”、“缩小”、“单页/双页”和“关闭”等按钮均无法响应鼠标点击,处于“假死”状态。 解决方法: 在调用A视图的CView::OnFilePrintPreview之前,先关闭用户对话框(CDialog::OnCancel),由于这时已不存在用于预览的A视图,再重新创建一个相同的视图(以下简称B视图),以B视图来启动OnFilePrintPreview进行预览。 MFC视图预览的原理是:以主框架窗口(CMainFrame)作为预览框架,隐藏原先的子视图(用CMainFrame::GetActiveView得到的那个,以下简称C视图),用CPreviewView类替换,同时创建包含“打印...”、“放大”、“关闭”等按钮的工具栏(CDialogBar类),最后将CPreviewView::m_pPreviewDC作为C视图OnDraw的CDC*参数传入,这样,虽然调用的是C视图的OnDraw函数,实际上却显示在了CPreviewView视图中,起到了“预览”的效果。在点击预览框架工具栏上的“打印...”按钮后, MFC体系将向原先的主框架(本例中和预览框架是同一个,都是CMainFrame)发送ID_FILE_PRINT的WM_COMMAND消息。在缺省的配置中,这将启动C视图的OnFilePrint,从而在打印机上打出C视图的内容。 在本例中,为了打印B视图,需要在CMainFrame中处理WM_COMMAND/ID_FILE_PRINT,加入额外的条件,来判断对按钮“打印...”的点击是来自B还是C视图的预览框架。在本例中用了一个变量CMainFrame::m_nPrintFrom。根据其取值(0或者1),分别启动B或者C视图的OnFilePrint。 使用方法: 程序示例在VC++2010上通过。主菜单项“打印预览测试”下,有两个子菜单项,“对话框用户视图打印预览”用于B视图(画出一个圆);“单文档视图打印预览”用于C视图(画出一个正方形),等同于“文件”主菜单项下的“打印预览(V)”。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值