基于IE内核的多媒体文件可视化程序实现(一)

目的

前回书说道,在信号处理或算法研究中,数据的可视化可以直观地展现和判别结果的合理性。如果只允许用C语言做开发,或要将C语言所做算法的输出数据进行展示,又不许用MATLAB、Python所带的可视化工具,那么,最快捷而直接的办法就是将数据以文本方式输出,再用Gnuplot工具来作图了。Gnuplot可以直接生成png或svg图片,Gnuplot所得的动画图还可以用gif格式保存。这样,通过WEB服务器,就可以调用生成结果在WEB上展示了。

一般,windows中的看图软件是不支持gif动画显示的,我们会找一些看图小工具软件来显示gif动图,或利用浏览器直接打开本地gif文件。但总觉不够方便,也显得不够专业。特别地,在自己的软件产品中,应该使用自己界面的图形可视化窗口,而不是带有第三方标记的东西。基于这种需求,我们特别需要有自己的本地文件浏览工具。在开发中可用,在产品中也可用。

基于微软的IE内核可以实现强大的html解析功能,而网页中所能展现的文件格式。IE浏览器内核也都能解析。许多第三方的浏览器都采用或至少兼容了IE内核。这里,我们采用IE内核作为多媒体文件的解析和浏览工具,尝试以最少的自编代码(基于VC++ MFC自动生成的代码量不计在内),去完成一个简洁而功能强大的本地文件浏览工具,具能使用命令行调用,这样C语言就能编写直接可看可视化结果的程序了。

功能和特征

如上回书说的,我们这个多媒体图片浏览工具应具有如下功能和特征:

  • 能显示各种格式的位图图片 (是一个看图软件)
  • 能显示矢量图(svg,wmf,emf)
  • 能显示动画(gif)或flash的swf
  • 能看各种格式的视频 (是一个视频播放器)
  • 能播放音频文件 (是一个音频播放器)
  • 能阅读pdf格式文档 (是一个Acrobat Reader)

还要求:

  • 这个软件要是有源码的(自己编写的)
  • 无商业版权冲突的,可以带上自己的LOGO。
  • 在软件体积上不能太大,最好在1M以内。
  • 这个软件是以命令行模式工作的。
  • 而且编写的代码量在100行以内。

实现思路

  • 首先通过VC++ MFC框架实现IE浏览器内核的嵌入,使之能浏览指定网页。这个有多种方法可实现,最简单的是采用Chtmlview类,以MFC工程向导自动产生代码,不必多写一行代码即可实现。
  • 然后,将浏览对象改为本地图片文件或本地html文件,使之能正确浏览显示。这里只需改一句代码。
  • 通过命令行参数将要打开浏览的文件路径参数传递进去,使IE内核的浏览对象指向该文件。这里需要解析输入的命令行参数,这用几十行代码可完成。
  • IE浏览器内核可直接打开常见图片格式的文件,如png,bmp,jpg,动图gif,矢量图svg,微软的 emf,wmf 格式等等,也能打开pdf文件(前提是IE浏览器装有acrobat的pdf插件。)
  • 对于有些文件,特别是多媒体文件,如mp3,wav,avi,swf等,IE内核不能直接打开,我们可以生成临时的html代码,将所要显示的多媒体文件包裹起来,再调用这个临时html文件即可。

编码

基于MFC面向对象的代码是层层包裹的,隐藏实现,用宏作消息映射,微软MFC甚至连winmain函数都给隐藏了,优点即是缺点,这让我想起乔治·奥威尔的名言:“战争即和平, 自由即奴役, 无知即力量”。我们在此就不求甚解好了。

第一个程序(向导生成,不改代码)

基于Chtmlview类的MFC应用程序:打开VC++集成环境(以 VC++6 为例, VS2010也一样),Ctrl+N 新建立一个工程,假设工程名为wsee,通过向导创建MFC应用程序。一切都选默认参数即可。
在这里插入图片描述

只是到了最后一步(step6 of 6),将CWseeView基于CHtmlView基类即可。

在这里插入图片描述
点击OK即生成工程代码。

在这里插入图片描述

立即编译(F7)之,应能通过。执行之,将会看到这样的结果:
在这里插入图片描述

这是一个基于MFC多文档结构的IE浏览器嵌入模板。由于是VC6,很早了,所以指向的微软网页已经找不到了。但程序运行的正确的。

第二个程序(修改网页指向)

打开wseeView.cpp, 查看其函数OnInitialUpdate(), 如下:

void CWseeView::OnInitialUpdate()
{
	CHtmlView::OnInitialUpdate();

	// TODO: This code navigates to a popular spot on the web.
	//  change the code to go where you'd like.
	Navigate2(_T("http://www.microsoft.com/visualc/"),NULL,NULL);
}

可见其中htpp指向。将其改为http://www.wtclab.net/ 试试?

Navigate2(_T("http://www.wtclab.net/"),NULL,NULL);

编译执行,得到:
在这里插入图片描述

可见,只要改变Navigate2函数的访问字串,即可显示相应网页内容。

假设在本地硬盘上有一个文件, 其绝对路径是d:\wsee\e1.gif, 则将字串file://d:/wsee/e1.gif 放入Navigate2函数,则可看到e1.gif动图。
在这里插入图片描述
在这里插入图片描述
可见这样的设计思路是可行的。

第三个程序(精简和自定义)

VC++默认的模板可能不符合我们的需要,因此在建立工程时要依据需求重新选择。

  • 单文档框架更合适。
  • 不需要菜单、工具栏、状态栏等,就一个简单说窗口即可。
  • 要用自己的图标。

为此,删除刚才新建的wsee工程及目录,重新建立wsee工程。这回选MFC单文档模式,且不用工具栏和状态栏。菜单不能去掉,要在代码中改。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
将网址改成指向微软主网站:
在这里插入图片描述
运行后即得:
在这里插入图片描述

我们去掉菜单栏:
CMainFrame::PreCreateWindow(CREATESTRUCT& cs)函数中,增加:

cs.hMenu = NULL;//即 菜单句柄赋值为空

即可。

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	cs.hMenu = NULL;//即 菜单句柄赋值为空
	return TRUE;
}

将Navigate2中的链接指向百度试试。得到
在这里插入图片描述

这样就符合最简窗口的要求了。

可以通过VC的资源管理器修改系统图标(16*1632*32两种),然后重新编译即得自己图标的程序了,雕虫小技而已。

在这里插入图片描述
在这里插入图片描述

发布为Relaese版本(24K)

在这里插入图片描述
可在VC++的build菜单中Set Active Configuration 来设置编译为发布版本而非调试版本。

Debug 版本为113KB, 发布版本仅24KB,其实,程序只是做了一个外壳,核心是windows系统是自带的IE浏览器在背后工作呢。

第四个程序(命令行参数引入)

显然, 只要通过命令行参数引入要访问的文件名,即可完成基本的图片文件显示。

但是,查MFC的Navigate2函数说明发现,该函数只接受绝对路径的文件访问。因此,如光想要在命令行参数中只使用文件名或相对路径,则需要在程序中将输入字串转为绝对路径方可正确应用。

另外一个问题是,如果我们还想利用这个程序访问互联网上的网页,又该如何做?显然采用条件句判断是本地文件还是远程网址,分别处理即可。

如何实现? 且看下回分解。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值