vc++学习篇(二)——打印和视频功能的实现

好久没有写技术文章了,这次是因为接了学校的一个活,没有办法,逼迫我继续学习vc++,现在不得已又硬着头皮去学习了,虽然自己知道这个东西很难,但是相信自己一定回胜利,而且,自己还有这么多朋友帮助,相信自己一定回学回的。

这次老师让我们回去了准备把以前的一个招生的系统的给更改以下,主要是添加两个功能:
1、打印和打印预缆功能
2、数码照相功能

对于第一个功能用mfc中的一些现成的就容易多了,而且查一些资料,然后自己看了,觉得就是对一些参数设置的东西,只不过需要更仔细一点了。
昨天看了以下相关的内容,过程好象是: OnFilePrint()->CView::OnPreparePrinting()->CView::OnBeginPrinting()->CDC::OnStartDoc()->CDC::OnStartPage()->CView::OnPrint()->OnStopPage()->CDC::OnStopDoc->CView::OnEndPrint(),
其中在OnStopPage中,如果需要打印的文章是多页的,它回自动返回到OnStartPage中,进行新的页面的打印,一直到所有的需要打印的文章都被打印完毕,这样就可以完成打印的功能。不过在消息中,下拉菜单中,是通过ON_FILE_PRINT来启用打印功能的,在这里还可以添加一些自己的用途和函数,实现用户自定义的一些功能。
而对于打印预览的功能好象是设置一个参数来实现的,改参数我记得不是很准了,看起来也很简单。
嘿嘿,说了这么多可能已经说迷糊了,还是看看别人的吧!

来源:源码天空
地址:http://www.codesky.net/article/list.asp?id=3232

如果你曾试过在基于C的SDK程序中编码以产生打印输出,你会喜欢MFC打印支持。
它虽不是一个彻底的解决办法,但它确实大大超过了SDK编码。由于打印支持是由
CView派生的,文档/视图结构有必要关注烦琐的程序内务。

一 设备无关性

设备需要一个描述表用作绘画的逻辑画布。正如显示有一个显示设备描述表一样
,打印机也要有一个打印设备描述表。当使用图形函数时,MFC使用同一代码在显
示设备描述表上和打印机设备描述表上绘画。这种两重性是通过CView::OnDraw()
方法来实现的。传入CView::OnDraw()的设备描述表指针可以来自表示两个不同设
备的任一地方,这种安排为MFC的设备无关打印及打印预览提供了多种手段。

打印循环CView::OnFilePrint()

MFC使用8种主要方法作为其“打印引挚”,打印过程的每一步包含了对一种CView
方法的调用,见下表

CView打印方法

方法 说明
OnFilePrint() 运行打印循环的主打印方法

OnPreparePrinting()  调用DoPreparePrinting()以显示Print对话框
DoPrepareprinting() 显示Print对话框
OnBeginPrinting() 分配用于在打印机DC上绘画的GDI资源的位置
OnPrepareDC() 在OnPrint()前由MFC调用。如同映像方式,该方法应位于设置DC属性处
OnPrint() 用打印机DC调用OnDraw()
OnDraw() 把文档数据再现于打印或打印预览方式的打印机DC
OnEndPrinting() 当打印结束后由MFC调用,使用该方法释放任被特殊分配的特定打印机的GDI资源

为使得MFC能响应打印命令,必须定义一个消息映像项,它使预定义的MFC值
ID_FILE_PRINT与控制打印过程的CView::OnFilePrint()方法相关联。该方法调用
其他CView帮助方法来使大量的打印过程自动化。可以直接用代码调用
CView::OnFilePrint().或者,MFC调用它以响应具有ON_FILE_PRINT值的任何命令
消息(如菜单上的打印命令)。

因为OnFilePrint()是保护类成员,该项必须驻留在视图类的消息映像中,如下述:

BEGIN_MESSAGE_MAP(CMyView,CView)

...

//Required for printing

ON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)

END_MESSAGE_MAP()

 

准备打印

为了对MFC应用程序的打印及打印预览提供支持,仅有一个方法你必须重新设计:
CView::OnPreparePrintinf(),该虚拟方法在打印或预览文档前由MFC调用,其原
型如下:

virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);

pInfo参数是指向包含当前打印作业信息的CPrintInfo对象的指针。

注意:如果打印作业被用户在结果打印对话框中取消,则
CView::OnPreparePrinting()方法调用CView::DoPreparePrinting()方法并返回零值。

CPrintInfo类结构

------------------------------------------

strut CPrintInfo //printing information structure

{

CPrintInfo();

~CPrintInfo();

CPrintDialog* m_pPD; //pointer to print dialog

BOOL m_bPreview; //TRUE if in preview mode

BOOL m_bDirect; //TRUE if bypassing Print Dialog

BOOL m_bContinuePrinting; //set to FALSE to end printing

UINT m_nCurPage; //Current pages

UINT m_nNumPreviewPages;//Desired number of preview pages

CString m_strPageDesc; //Format string for page number display

LPVOID m_lpUserData; //pointer to user created struct

CRect m_rectDraw; //rectangle defining usable page area

void SetMinPage(UINT nMinPage);

void SetMaxPage(UINT nMaxPage);

UINT GetMinPage() const;

UINT GetMaxPage() const;

UINT GetFromPage() const;

UINT GetTopPage() const;

}

CPrintInfo类数据成员

数据成员 说明
m_pPD 指向作为Print对话框的CPrint Dialog对象的指针
m_bDirect 指示文档是否正在直接打印的标志,它旁路Print对话框
m_bPreview 指示文档是否正在预览的标志
m_bContinuePrinting  指示MFC是否应该保持在打印循环内的标志
m_nCurPage 当前正在打印的页数
m_nNumPreviewPages 确定多少页应该显示在打印预览窗口:1或2
m_lpUserData 指向应用程序定义结构的指针
m_rectDraw 定义打印机DC上的当前可用页区域的矩形框
m_strPageDesc 含有页号显示信息的格式字符串

CPrintInfo类方法

方法 说明
SetMinPage() 指定文档的第一个页数(通常为1)
SetMaxPage() 指定文档的最末页码
GetMinPage() 获取文档的第1页码
GetMaxPage() 获取文档的最末页码
GetFromPage()  获取待打印的第1页码
GetToPage() 获取待打印的最末页码

Print对话框

CView::OnPreparePrinting()方法的默认实现如下所示:

BOOL CDocView2View::OnPreparePrinting(CPrintInfo *pInfo)

{

//default preparation

return DoPreparePrinting(PInfo);

}

此默认处理仅调用CView::DoPreparePrinting()方法,后者自动处理调用,而不考虑Pring对话框。

该对话框从获得指向CPrintInfo对象的指针(PInfo)的
CView::DoPreparePrinting()方法中被调用。CView::DoPreparePrinting()方法
具有以下原型:

BOOL DoPreparePrinting(CPrintInfo* pInfo);

MFC使用由用户在Print框输入的值来填充各种CPrintInfo类数据成员,然后,
Print对话框作为CPrintInfo对象成员(pInfo->m_pPD),创建打印设备描述表作
为其hDC成员,方法如下:

if(pInfo->m_pPD->m_pd.hDC==NULL)

{

//call CreatePrinterDC if DC was not created by above

if(pInfo->m_pPD->CreatePrinterDC()==NULL)

return FALSE;

}

提示:在调用CView::DoPreparePrinting()之前,设置CPrintInfo类成员以控制
Print对话框上的显示值。你指定的值的出现在相应的对话框控件中。

如果m_bPreview成员为FALSE,则仅显示Print对话框;在打印预览过程中该对话
框不出现。可以用改变m_bPreview成员值的办法控制对话框的出现,旁路实际打
印作业的Print对话框。打印设置描述表被创建及在CView::DoPreparePrinting()
中的CPrintInfo数据被初始化之后,其调用方法CView::OnPreparePrinting()即
退出。MFC的打印例程的下一站是CView::OnBeginPrinting()方法。

开始打印作业

CView::OnBeginPrinting()方法的首要任务是使合法的打印DC对你的应用程序是
可用的。重新设计该方法以提供基于打印机DC特性的初始化。该方法的原型表示
如下:

virtual void OnBeginPrinting(CDC* pDC,CPrintInfo* pInfo);

打印或打印预览作业开始时,MFC调用该方法,后者在默认的CView实现中不做什
么工作。通过重新设计OnBeginPrint()的途径,你可分配在打印过程中可能需要
的任何GDI资源。如果你分配OnBeginPrint()中的GDI对象,例如,选定几把刷子
进入打印DC,可从优先的CView::OnPrint()方法内部来选,打印实际在其内部进
行(通过CView::OnDraw).

从OnBeginPrint()返回后,OnFilePrint()方法开始主打印循环,在此循环内,文
档的每一页都初始化并(以长度)被打印。

准备打印设备描述表

在设备描述表(即在OnDraw()方法中)上使用任何图形方法之前,调用
OnPrepareDC()方法以使应用程序调整DC的特性。该方法的原型表述如下:

virtual void OnPrepareDC(CDC* pDC,CPrintInfo* pInfo=NULL);

该方法通常被重新设计以设置新的映像方式或DC的某些其他特性。

打印作业

调用OnPrepareDC()之后,MFC调用CView::OnPrint()方法来打印或预览每一个文档页:

virtual void OnPrint(CDC* pDC,CPrintInfo* pInfo);

OnPrint()使用CPrintInfo结构的m_nCurPage成员来确定打印的当前页,然后
OnPrint()调用OnDraw()来绘制打印机DC上的页。

文档的每一页调用一次OnPrint()方法。如果有多页文档需重新设计此涵函数以实
现页打印逻辑。这需要通过操作视窗原点仅绘制OnDraw()的当前页,从而对打印
循环的每次迭代视图会移动一页,它也可使你仅打印褶边如页眉及页脚。

这里有一个最小的已重新设计的OnPrint()方法,它最后调用具有打印DC作为参数
的OnDraw()方法:

void CSomeView::OnPrint(CDC *pDC, CPrintInfo *pInfo)

{

OnDraw(pDC);

}

如果文档超过一页,打印循环的下一次迭代从OnPrint()返回后开始。

清除

文档的全部页码打印完后,打印循环结束(或打印预览结束),MFC调用可以重新
设计的CView::OnEndPrinting()方法来释放分配在OnBeginPrinting()中的任何
GDI资源。该方法的原型如下所示:

virtual void OnEndPrinting(CDC* pDC,CPrintInfo* pInfo);

注意:如果打印机图像不同于显示图像,且需要附加打印机特定的GDI资源时,通
常才使用分配和释放OnBeginPrinting()方法中的GDI资源。

而对于第二个问题,我现在只是有一个初步的影响,知道大概的步骤,但是详细的细节还没有试过,查了以下msdn,发现如果仅仅想实现一个简单的功能,只需要两步就可以完成,先连接视频设备,然后再建立一个捕捉窗口对视频设备的内容进行操作,使用了两个函数,一个是capCreateCaptureWindow()和capDriverConnect()函数来实现,现在我知道这些的大概,但是还没有认真的看过相关的细节,等我看了再来写吧!

嘿嘿!希望在我回去以前能把这个东西看完,因为我还有一个更大的东西需要做啊!

时间: 2024-10-28 03:57:55

vc++学习篇(二)——打印和视频功能的实现的相关文章

自动化测试学习(二) selenium IDE功能扩展

通过上一节的学习,相信我们已经会selnium IDE的基本使用了,为了使selenium 更强大,其实selenium 还提供了良好的扩展能力. ----//用户扩展 用户扩展就是使用javaScript文件来创建定制化特性,添加新功能,通常情况下这种扩展就是定制化命令,但扩展并不仅限于命令. 这里有一些列的扩展:http://wiki.openqa.org/display/SEL/Contributed+User-Extensions 1.下面我们利用扩展的方式,产生一个用户随机数字 为了使

vc++学习篇(三)——预处理命令之条件编译(#ifdef,#else,#endif,#if等)

    预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作.说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译.这样做的好处是,经过处理后的代码,将会变的很精短.  关于预处理命令中的文件包含(#include),宏定义(#define),书上已经有了详细的说明,在这里就不详述了.这里主要是对条件编译(#ifdef,#else,#endif,#if等)进行说明.以下分3种情况:1:情况1:#ifdef _XXXX...程序段1...#else...程序段

微信视频功能详细功能性能测试用例的编写

问题描述 微信视频功能详细功能性能测试用例的编写 最近在自学移动app的测试,想总结一份完整的微信视频功能测试用例,尤其性能方面测试时的具体用例,测试方法,测试工具有哪些? 解决方案 http://www.ltesting.net/ceshi/ceshijishu/csyl/ 解决方案二: 微信视频功能测试用例,首先你要分析一下微信视频功能. 如果只是黑盒测试,应该没有多少测试用例.但白盒,你没有代码也无从谈起.

CYQ.Data 轻量数据层之路 使用篇-MAction 数据查询 视频 E (二十二)

说明: 本次录制主要为使用篇:CYQ.Data 轻量数据层之路 使用篇二曲 MAction 数据查询(十三)   的附加视频教程-下半部分. 本次视频介绍了: 1:GridView/DataList/Repeater控件配合分页控件实现列表绑定. 2:利用视图实现多表操作 3:得用自定SQL语句实现多表操作.   这本次录制的视频上传于-秋色园: 注意如果要看清晰版本,要点击视频下面的:查看原始大小的动画 本次视频大小分辨率为:1024*768,依旧坚持走高清.无码的路线,为观众提供良好视觉享受

VC调试篇

难怪很多前辈说调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言.不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件.   我以前接触的程序大多是有比较成形的思路和方法,调试起来出的问题都比较小,最近这个是我自己慢慢摸索调试,接触了很多新的调试方法,并查了很多前辈的总结,受益匪浅,总结以前的和新的收获如下: VC调试篇 设置为了调试一个程序,首先必须使程序中包含调试信息.一般情况下,一个从AppWizard创建的工程中包含的Debug Configuration自动包含调

C#学习笔记(二)

笔记 C#学习笔记(二) write by cash(天下第七)2002.01.20版权所有,翻录不究cashcao@msn.com 选择 我身上携带着精神.信仰.灵魂 思想.欲望.怪癖.邪念.狐臭它们寄生于我身体的家 我必须平等对待我的每一位客人-----------伊沙:<原则> 我的名字是cash,所以我很功利主义:我的星像是Leo,所以我很大男人主义:我的语言是C#,所以我有点儿拿不定主义. /* 你能看得出来,这不是一篇正规的技术文章,所以若你不小心从里边读到了一个爱情故事,可不要奇

拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录

目录 目录 前言 关于这本书 必看知识点 最后 前言 相信部分刚进入这个行业的新同学会对一个问题感到疑惑,为什么从培训学校出来的学员不被欢迎? 这里记录下一些我个人的看法(博主也曾有面试新员工的经历):说到底还是一个学习能力的问题.就这一点,从我的经历看来(曾到多家企业培训新人),培训出身的技术人员大体而言确实没有科班出身的学得更快准狠一些.学习能力这个东西其实比较虚,它并没有一个直观的考量方式,所以企业一般都会简单粗暴的使用学历.专业.项目经验来衡量.这之间反映了你的计算机知识框架是否完善.基

【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇二:基于OneNote难点突破和批量识别

      篇二:基于OneNote难点突破和批量识别 [1]开篇概述:在对本章技术介绍前,还是梳理下思路.描述下本章功能和开发过程.做个系统大致了解之后,在粘贴出本节效果图配以完整代码,然后分拆之,个体技术剖析.这样既可以达到全局整体效果,也可以对局部技术或者知识点做以小结.功能看图描述:本程序开发基于C#+WPF,然后这些条件具备前需要安装office2010以上版本,包含OneNote即可   完整代码:   namespace OnenoteOCRDemo { /// <summary>

干货 | 算法工程师入门第二期——穆黎森讲增强学习(二)

雷锋网(公众号:雷锋网)按:大牛讲堂算法工程师入门系列第二期-穆黎森讲增强学习(二),上一讲内容主要涉及增强学习基本概念及Deep Q Learning的相关内容,本讲除了Deep Q Learning的相关拓展内容.DQN和近期的一些进展. 传送门:干货 | 算法工程师入门第二期--穆黎森讲增强学习(一) Beyond Deep Q Learning DQN将一个强大的工具deep neural network 引入RL,解决了这中间遇到的很多新问题,收到了很好的效果.自从这篇工作以后,一方面