下载本文示例代码

下载源代码

摘要

通过PDF控件做一个PDF格式电子图书浏览器,学习一类控件的使用方法。

关键词 PDF控件 电子图书浏览器 控件使用

首先声明,做这个PDF格式电子图书浏览器,其目的并不仅仅是教你如何做这个浏览器,而是教你如何正确使用控件进行编程。要提醒你的是,如果你想进行这个实验,那么你的机器上面必须安装有 Adobe

Acrobat 4.0(或者更低版本),经笔者实验,Adobe Acrobat 5.0 和 Adobe Acrobat

6.0 所提供的控件都是无法添加到我们的工程中去的。

要新建一个基于对话框的工程。需要注意的是,一定要在第二步中选中ActiveX

Controls,否则在以后的步骤中还需要手动添加一些代码,挺麻烦的。下面的步骤按其默认既可。

图1

在下面出现的对话框中,可以把附加的控件删除。

下面,我们要往项目里面加入PDF控件。Project- >Add To Project- >Components and Controls- >Registerded

ActiveX Controls,双击,在下面的控件窗口中找到"Acrobat Control

用于ActiveX",选择下面的按钮"Insert",下面点击确定,正确插入后,我们可以在下面的框架里看到"Acrobat Control for

ActiveX"然后"Close"。

图2

为了能够利用这个刚刚加入的控件,我们还需要在"ResourceView"加入一个Menu(菜单),具体做法为"PdfReader

resource"右健选择"Insert",下面的就是新建一个"Menu"。但是,我们只是插入了这么个菜单,在程序中还是没有法调用的。这时返回到主对话框中,右健单击,选择"Properties"(属性),在"Menu"中选择刚才加入的Menu的ID。

现在,为了使我们的这个PdfReader工作,我们要在菜单中加入"打开",其ID可为ID_OPEN_PDFFILE,我们选择把"Pop-up"前的钩去除(注:如无说明,在菜单内加入其它选项,都是按照把"Pop-up"前钩去掉处理)。

图3

下面要用到ClassWizard(类向导)为刚刚加入的ID映射函数OnOpenPdffile()。

图4

此时需要在CPdfReaderDlg加入:

public:CPdf m_PdfFile;

响应ID_OPEN_PDFFILE"打开"代码:

void CPdfReaderDlg::OnOpenPdffile()

{

char szFileFilter[]="PDF File(*.pdf)|*.pdf|All File(*.*)|*.*||";

CFileDialog FileDialog(true,"","",OFN_EXPLORER,szFileFilter,this);

if(FileDialog.DoModal()==IDOK)

{

CStringFilePath=FileDialog.GetPathName();

m_PdfFile.LoadFile(FilePath);

}

}

因为在上面的代码中我们直接引用PDF控件所产生类的函数的LoadFile(),很显然我们需要在"PdfReaderDlg.h"中加入"#include "pdf.h"."也许心情迫切的你想编译现在的程序,行啊。运行一下,没有什么错误。选择"打开",找到具有".pdf"格式的文件,可是会出现系统的警告错误。是什么原因呢,请想一想啊。对,我们还没有给控件在对话框内分配其存在空间呢。下面就是我们要做的。

利用Classwizard(类向导),为WM_CREATE消息映射个函数OnCtreate().其代码如下:

int CPdfReaderDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CDialog::OnCreate(lpCreateStruct) == -1)

return -1;

CRect rect;

GetWindowRect(&rect);

m_PdfFile.Create(NULL,WS_VISIBLE,rect,this,0);

return 0;

}

这时候你再编译,是不是可以观看PDF格式电子图书了?但是,细心的你,是不是发现,我们的窗口既没有最大化、最小化按钮,也不能在对话框边角位置拖动其大小。不用急,下面我们就准备做这些工作。

返回到主对话框,右键单击,选择"Properties"(属性),在"Styles"里"Border:"选择"Resizing",在"Minimize

box"和"Maximize box"前选择打钩。那么我们的问题就算解决了。

图5

在下面的拖拉对话框大小的时候,你也许会发现,我们的阅读pdf电子图书那部分窗口却没有发生什么变化,是不是感到美中不足呢。对于这个问题,用一个函数就可以完美解决。我们需要用WM_SIZE映射一个函数OnSize()。

void CPdfReaderDlg::OnSize(UINT nType, int cx, int cy)

{

CDialog::OnSize(nType, cx, cy);

m_PdfFile.MoveWindow(0,0,cx,cy); //我们就需要加入这么一行就行了。

}

在我们的菜单里就"打开"这么一个选择未免太单调,我们可以自己手动加入一些东西。比如,"上页""下页""首页""末页""退出",其对应ID分别为:ID_PREVIOUS_PAGE,ID_NEXT_PAGE,ID_FIRST_PAGE,ID_LAST_PAGE,IDCANCEL(这里要说的是,在其菜单属性里把"Pop-up"前钩去掉),其对应函数分别为:

void CPdfReaderDlg::OnFirstPage()

{

m_PdfFile.gotoFirstPage();

}

void CPdfReaderDlg::OnLastPage()

{

m_PdfFile.gotoLastPage();

}

void CPdfReaderDlg::OnNextPage()

{

m_PdfFile.gotoNextPage();

}

void CPdfReaderDlg::OnPreviousPage()

{

m_PdfFile.gotoPreviousPage();

}

void CPdfReaderDlg::OnCancel()

{

CDialog::OnCancel();

}

我们能不能控制PDF格式电子图书显示的大小呢,答案是肯定的。在菜单中加入"视图",其子项为"放大","缩小",对应ID为ID_CHANG_BIG,ID_CHANG_SMALL。相应函数可为:

void CPdfReaderDlg::OnChangBig()

{

i=i 50; //设定i的变化范围。你可以改变一下i每次变化的大小。

m_PdfFile.setZoom(i);

}

void CPdfReaderDlg::OnChangSmall()

{

i=i-50;

m_PdfFile.setZoom(i);

}

注意:要在PdfReaderDlg.cpp前面加上

int i=100; //初始化i的大小

当然,你也可以添加一个新的对话框 ,用来设定PDF格式电子图书显示的大小。新加一个对话框后,生成相应的类,如CFind。在新生成的对话框内添加"Static"和 "Edit"控件。见下表和图8:

Static Text 控件自定义大小:

Edit Box 控件IDC_FIND

图6

声明后,打开Classwizard(类向导),选择"Member Variables",选择"Add Variable",为IDC_FIND映射float类型变量m_find。

图7

现在往菜单视图里加入"自定义大小",ID为ID_SET_SIZE,相应函数极其代码如下:

void CPdfReaderDlg::OnSetSize()

{

CFind getsize;

getsize.DoModal();

m_PdfFile.setZoom(getsize.m_find);

}

仅仅加入这些代码,还不行,在OSetSize()直接使用CFind,这个类还没有声明,因此我们需要在"PdfReaderDlg.h"里加入"Find.h".

如果考虑到"打印"的话,在菜单里加入"打印",ID为ID_PRINT_PDFFILE,映射对应函数:

void CPdfReaderDlg::OnPrintPdffile()

{

m_PdfFile.Print();

}

到此时,我们的这个PDF电子图书浏览器算是初具规模了。下面我们要添加一些小的功能。 比如在窗口栏内显示阅读PDF电子图书的名称。这项功能可在下面函数里添加:

void CPdfReaderDlg::OnOpenPdffile()

{ CString m_Caption; //新添加的一个变量,用于显示窗口标题

CString m_Word=" 现在正在观看:";//也是新添加的

char szFileFilter[]="PDF File(*.pdf)|*.pdf|All File(*.*)|*.*||";

CFileDialog FileDialog(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);

if(FileDialog.DoModal()==IDOK)

{ CString FileName=FileDialog.GetFileTitle();

m_Caption=m_Word FileName;//CString类型的重载操作。

SetWindowText(m_Caption);//设置在窗口显示

CString PathName=FileDialog.GetPathName();

m_PdfFile.LoadFile(PathName);

}

}

我们要对这个浏览器整容,我们要给对话框添加红色背景。

SetDialogBkColor(RGB(255,0,0) );

把上面这句添加到InitInstance()里既可。我们运行出来的对话框左上角的那个系统默认图标,实在没有个性。好办,我们要换成我们喜欢的小图标。首先用鼠标选中,按"Delete"键删除系统默认ICO图标,然后在Menu上右键单击,选择"Insert",在下面的出现的对话框中选中"Icon",单击"Import"按钮选择你要插入的Icon图标。在新插入的Icon图标上单击右键,选择"Properties",把其ID修改为"IDR_MAINFRAME",现在运行一下,看看效果。

图8

我们的程序到此算是告一段落了。下面我们要总结一下。我们从加入的"Acrobat Control 用于ActiveX"控件所产生的类"CPdf"引用的函数有:

BOOL CPdf::LoadFile(LPCTSTR fileName)

void CPdf::Print() //用于打印文件

void CPdf::setZoom(float percent)//设置页面的大小

void CPdf::gotoFirstPage()//到第一页

void CPdf::gotoLastPage()//到最后一页

void CPdf::gotoNextPage()//到下一页

void CPdf::gotoPreviousPage()//到上一页

这些函数相对于类"CPdf"来说,只是很少的一部分,下面就要看各位的努力去丰富我们的"PdfReader"浏览器了。因为,本文的目的,不仅仅是教会您如何做一个PDF浏览器,而是通过做这么个简易的浏览器,触类旁通。如果您仔细的阅读了本文,那么首先庆祝您现在利用FLASH控件"Shockwave Flash Object ",Windows Media Player提供的"ActiveMovieObject Control"控件,还有RealOne Player播放器提供的控件"RealPlayer G2 Control"(前提是你的电脑上面安装有RealOne)等一类控件可以自己制作完全属于自己的FLASH播放器,Windows Media播放器,以及RealOne 播放器等。

最后需要说明的是,关于添加控件,也可以在对话框内右键单击,选择"Insert ActiveX Control",在下面出现的控件选择对话框里选择我们需要用到的控件既可。下面的步骤和我们在前面所介绍的步骤类似,在此不再介绍。至于,本文所牵涉到的源码,如果各位想参考的话,其下载地址为:

有什么问题可发信到:nie_yong@163.com,定会全力解答。祝愿各位,都能在编程的天空自由翱翔!

下载本文示例代码

输入您的搜索字词

提交搜索表单

空间电子书架用flashi还是html,做个PDF格式电子图书浏览器——浅谈一类控件的使用...相关推荐

  1. 使用GridView做出列选择效果(获取动态生成的控件.鼠标点选GridView.Ajax控件)

    先看效果图: 其实就是个一览定制的效果,只不过由于项目的需要,需要使用GridView进行设计,至于为什么不直接使用Html+JQuery,还是因为项目需要,不然维护起来会很麻烦,在制作的过程中会遇到 ...

  2. python0不能做除数、怎么解决_浅谈pandas dataframe对除数是零的处理

    如下例 data2['营业成本率'] = data2['营业成本本年累计']/data2['营业收入本年累计']*100 但有营业收入本年累计为0的情况, 则营业成本率为inf,即无穷大,而需要在表中 ...

  3. Repeater控件中如何做编辑和删除功能

    做asp.net有六年了,Repeater控件使用了无数次,但每次都是只做显示. 今天这个需要编辑和删除功能,google了一下.Repeater需要加OnItemDataBound事件. OnIte ...

  4. 动手做ASP.NET 2.0服务器端控件——AutoCheckTreeView(二)接口设计

    感谢谭振林先生所著<道不远人--深入解析ASP.NET 2.0控件开发> 讨论完了功能,我们来思考一下这个控件应该怎么设计. 1,给控件取个名字吧,因为一开始小凡只是考虑了自动勾选功能,所 ...

  5. 完全开源Android项目:PDF电子书架软件——不动的大图书馆

    不动的大图书馆 Author:雾雨霜星 Web:雾雨霜星 | DA☆ZE (shuangxing.top) Time:2021-09-04 软件简介 "不动的大图书馆"是一款简单. ...

  6. 华视电子读卡器web开发_华视电子官方微信公众号电子书架正式上线 - IT业界_CIO时代网...

    为感谢广大客户长期以来对华视电子的支持,给大家提供更方便快捷的服务,满足大家移动端的需求,深圳华视电子读写设备有限公司(简称:华视电子)官方微信公众号电子书架平台正式上线了. 电子书架平台整合产品程序 ...

  7. 华视电子读卡器web开发_业界动态:华视电子官方微信公众号电子书架正式上线...

    为感谢广大客户长期以来对华视电子的支持,给大家提供更方便快捷的服务,满足大家移动端的需求,深圳华视电子读写设备有限公司(简称:华视电子)官方微信公众号电子书架平台正式上线了. 电子书架平台整合产品程序 ...

  8. 空间电子系统设计1:空间环境

    空间电子系统设计1:空间环境 文章目录 空间电子系统设计1:空间环境 前言 一.空间环境 二.范艾伦带 三.低轨卫星轨道辐照情况 三.中高轨卫星轨道辐照情况 总结 前言 第一章 空间电子系统设计1:空 ...

  9. 电子书架-小程序文件API

    效果: 在上一篇文章中搭建的模拟服务器phpStudy中的文件地址中的www文件 在www文件中再创建一个books文件用于存放电子书 创建完电子书文件之后就可以在浏览器上输入http://local ...

最新文章

  1. Litmus代码质量平台实践总结
  2. python array赋值_从踩坑学Python内部原理(5):执行时机的差异
  3. python基础教程3-Python基础教程(三)
  4. cad模糊查询符号_万能模糊查询SQL
  5. ubuntu12.10下arm-linux-gcc交叉编译环境的搭建
  6. 竞争神经网络与SOM神经网络及其在矿井突水水源判别的应用
  7. c++获取输入数字的位数/获取位数并且将其存入数组中/获取位数存入数组并且利用它解决实际问题
  8. 计算机导论的知识,计算机导论课的认识
  9. 发现了 四川方言版的让子弹飞 的种子
  10. DeepFaceLab报错,CUDA driver is insufficient 解决方法!
  11. Web页面打印及GridView导出到Excel
  12. 33.启动流程,模块管理与 Loader
  13. html服装商品分类页面,商品分类.html
  14. Hyper-V Windows 8.1 Windows Server 2012 R2 QA
  15. thinkpadt410接口介绍_ThinkPadT410全程拆解
  16. 数理统计复习笔记九——正态性检验
  17. php入侵代码,入侵PHP网站就这么简单.pdf
  18. 红孩儿编辑器的模块设计9
  19. 人机协作机器人发展趋势_目前国内机器人发展存在三大困境,人机协作被广泛关注有以下几点原因...
  20. 学python编程能做什么项目_十个Python练手的实战项目,学会这些Python就基本没问题了...

热门文章

  1. UCML工作流使用案例
  2. <hy-trip>项目记录
  3. MLB经理和第九局谬论
  4. form action参数传递的几种方式
  5. PhotoSwipe:学习PhotoSwipe.js 相册展示插件
  6. MSF生成windows木马
  7. 数独游戏-蓝桥杯-C语言,数独游戏_java_深搜+回溯
  8. 流媒体服务器 ZLMediaKit介绍
  9. 论如何用添加任务计划来实现电脑自动关机
  10. matlab删失数据威布尔,scipy.stats.威布尔分钟.fit()如何处理右删失数据?