信息产业部电子第二十二研究所青岛分所 郎锐
引言 随着网络技术的发展,网页的实现语言也由最初静止的超文本标识语言(HTML)发展到了现在广泛使用的动态超文本标识语言(DHTML),由于在这种新标识语言中可以使用CSS(层叠式样式表单)、JavaScript和VBScript等脚本语言以及其他的一些外部COM控件因此其可编程能力得到大大的加强,尤其是Java语言的兴起更起到推波助澜的作用。由于Java是一种功能非常强大的网络语言,因此在网页设计时往往借助其来实现一些实现起来颇为复杂但却十分美观别致的网页特效。虽然在另一种功能强大且素有"Windows 外科手术刀"之称的VC++下对于某些特效也可以通过编程实现,但实现过程往往比较复杂,比如 模拟焰火或烟雾的运动过程(动画)就需要用到DirectDraw等高级编程技术,其实现难度远大于网页特效的实现过程。正因如此,本文就对如何把实现起来较简单的用DHTML开发的网页特效移植到VC++下展开讨论。
1 DHTML实现的网页特效 编写网页的HTML/DHTML语言区别于以往的编程语言的一个最大特点就是源码公开,当看到一个好的网页时可以通过"查看源文件"看到作者是如何组织、设计该网页的,而且可以从代码级上对其进行分析。当我们看到其他一些好的应用程序时只能根据自己的编程经验和程序的实现功能来对程序的设计思路和实现方法进行猜测,而不少好的功能在无源码的情况下无法再次编程实现以为我所用,而这些在网页设计上则不存在任何问题,可以通过参考他人写的比较好的代码来提高自己的设计水平。 前面已经提到过,DHTML语言的实现可以通过CSS、各种脚本语言、控件和JavaApplet等予以实现,其中JavaApplet可以轻易设计出一些非常令人叹服的网页特效。下图所示的网页就是一个用JavaApplet插件实现的非常逼真的模拟焰火运动过程的特效网页。可以通过查看源文件来观察其实现代码:
…… …… 其中FireWork.class是整个模拟过程的核心,其部分主要源码如下:
…… public class FireWork extends java.applet.Applet { public void init() { int width,height; symantec.itools.lang.Context.setApplet(this); //{{INIT_CONTROLS setLayout(null); width = this.size().width; height = this.size().height; setSize(width,height); setForeground(new Color(16711935)); setBackground(new Color(0)); firework1 = new symantec.itools.multimedia.Firework(); firework1.setBounds(0,0,width,height); add(firework1); //}} } //{{DECLARE_CONTROLS symantec.itools.multimedia.Firework firework1; //}} } …… 其需要有IE 4.0、Netscape 4.03或更高版本浏览器的支持。
2 在VC++中引入特效网页 在DHTML下可以借助.class文件以插件的形式轻松实现对焰火的真实模拟,而如要通过VC++来实现类似的效果,虽然也可以通过DirectX技术中的DirectDraw技术加以实现,但仅对于该技术本身而言就足以使一个普通程序员感到吃力,更何况此时尚没有把火焰的模拟算法考虑在内!既然用DHTML实现网页特效比较容易,那么可以设想:先通过DHTML做好一含有指定特效的网页,然后想办法把该网页通过编程的手段将其嵌入到VC++设计的程序中,即用混合编程的方法实现在VC++下的特效设计。 混合编程可以很好的把两种或更多语言的优点融合在一起,通过优势互补实现单一语言所不能实现的特殊功能。VC++凭借其强大的编程手段可以很好地同VB、Delphi甚至汇编进行混合编程,以期能达到最佳效果。对于HTML/DHTML语言,VC++ 6.0在MFC(微软基本类库)中提供有一个从CView派生出来的子类CHtmlView。在用VC++进行程序设计时可以将视类从CHtmlView中派生,以继承其对HTML/DHTML的支持特性,从而能很简便方式实现对网页的嵌入。
2.1 程序框架的建立 在建立程序框架时可以根据需要选取不同的形式,但必须保证在最后一步选则以CHtmlView为基类。如果没有选择,或要使已有程序具备上述功能也可以通过搜寻与替换将视类头文件和源文件中所有的CView替换成CHtmlView,以完成基类的转换。
2.2 特效网页的嵌入 通过MSDN帮助查看其成员函数可以得知Navigate2();函数可以在客户区显示指定的网页(网络上的或本地的)该函数的原形如下:
void Navigate2( LPITEMIDLIST pIDL, DWORD dwFlags = 0, LPCTSTR lpszTargetFrameName = NULL );
void Navigate2( LPCTSTR lpszURL, DWORD dwFlags = 0, LPCTSTR lpszTargetFrameName = NULL, LPCTSTR lpszHeaders = NULL, LPVOID lpvPostData = NULL, DWORD dwPostDataLen = 0 );
void Navigate2( LPCTSTR lpszURL, DWORD dwFlags, CByteArray& baPostedData, LPCTSTR lpszTargetFrameName = NULL, LPCTSTR lpszHeader = NULL ); 尽管原形各不相同,但最主要的参数是第一个参数,它指定了网络上网页的URL(统一资源定位符)或是本地机上的网页的存放路径,需要特别指出,这里的存放路径必须是完整的绝对路径,相对路径将会导致失败。因此为了保证程序在路径改变后能正常工作,需要在显示网页之前通过GetModuleFileName()函数动态判断程序的当前存放路径。下面将特效网页嵌入部分的主要实现代码介绍如下:
…… //获取到当前应用程序存放的全路径,如C:\Windows\nope.exe形式 char exeFullPath[MAX_PATH]; GetModuleFileName(NULL,exeFullPath,MAX_PATH); //将路径分离出来,得到如C:\Windows\的形式 CString string;
string.Format("%s",exeFullPath); exeFullPath[string.GetLength()-9]='\0'; string.Format("%s",exeFullPath); //在路径后添加特效网页的路径,得到如C:\Windows\test.html的形式 string+="test.html"; //在客户区显示具有特效的网页 Navigate2(string,NULL,NULL); …… 经过DHTML网页嵌入后的VC++程序的运行效果如上图所示,在程序中适当的应用网页特效可以起到美化界面,加 强人机友好程度等较好的效果。
3 小结 本文通过对CHtmlView的派生继承实现了在VC++下嵌入DHTML语言,并可借助所嵌入的DHTML语言实现一些在VC++中难以做到的或是实现起来颇为复杂的特效,并以此丰富程序的人机界面。本文所述思想具有较好的通用性。程序在Windows 98下,由Microsoft Visual C++ 6.0编译通过,浏览器为IE 6.0。
|