当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 仿制金山毒霸专杀工具界面

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 仿制金山毒霸专杀工具界面


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 96 ::
收藏到网摘: n/a

仿制金山毒霸专杀工具界面
作者: 西安 汪俊

下载本文示例源代码

金山毒霸2002自推出以来,广受用户的喜爱。今天在这里我要谈的不是金山毒霸的功能,而是其别具一格的界面。本人早就对金山毒霸的界面垂涎三尺,如果自己的程序里能用上金山毒霸那样的界面,那该多爽!

说干就干,本着由浅入深的原则,我选择了金山毒霸的一个附带工具:Duba_GOP.exe来开刀。该工具在金山毒霸的网站上可以下载到,其

界面如图所示:

好,开始准备工具:
提取资源工具:freeRes
编程工具:VC++
还有一个Vc自带的小工具:spy++
之所以不用大家都熟悉的eXeScope,是因为Duba_GOP.exe已经被压缩过了,有些资源提取工具无法再用。
用freeRes打开Duba_GOP.exe,可看到其带有20个bmp位图,有整个窗体的背景图,右上角两个小按钮“主页”和“关闭”的三态位图,以及两个大按钮“浏览文件夹”和“开始扫描”的三态位图。看到这些图片,即可猜到该软件是没有标题栏的,而显示出来的标题栏只是背景,而且连同窗体下部的金山毒霸的标志都是属于同一幅背景图片!那么“标题栏”上的“主页”,“关闭”是怎么回事?用spy++来试一下,发现这两个是Button,而不是Bitmap。同样“浏览文件夹”和“开始扫描”也是Button,随即想到这四个Button可以用VC中的CBitmap类来实现。而窗体下部的超链接仅仅是Static静态框。把这些难点分析出来了,下面就可以开始我们的编程之旅了,不过记得把有用的图片保存下来。

一.窗体背景问题
打开vc,新建一个对话框工程,名为Interface。去掉缺省的一个Static和两个Button,在窗体上点右键,在出现的属性对话框中,去掉标题栏,再将用freeRes提取的所有图片Import进工程的资源中。修改CInterfaceDlg::OnPaint()如下:

void CInterfaceDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else {// CDialog::OnPaint();//将这一句注销掉 *************************************************************** CPaintDC dc(this); CRect rect; GetClientRect(&rect);//得到窗体的大小 CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAPBACKGROUND);//加载背景图片 BITMAP bitMap; bmpBackground.GetBitmap(&bitMap); CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);//画窗体 ************************************************************** }}

其中两个“*”行之间的部分为所添加部分。

这段代码的作用是将那幅背景图片画在窗体上, 其中我使用了StretchBlt来画出窗体,StretchBlt比BitBlt要慢许多,如果你想得到更好的速度,可以考虑建立与背景位图相同尺寸的窗体,然后用BitBlt来画出。CBitmap bmpBackground;最好作为CInterfaceDlg的成员变量并在CInterfaceDlg::OnInitDialog中提前加载位图,感兴趣的朋友可以试试。

编译,运行。可看到修改后的效果,由于该图片是平铺在窗体上的,如果图片和窗体尺寸不一致就会导致图片发生扭曲。因此可将窗体调整到与图片相同或相近的尺寸大小,那么运行后看起来就顺眼多了。但是窗体边框还是不大对劲,于是再进vc的资源编辑器,将窗体的Border由“Dialog Frame”该为“Thin”,重新编译,运行,搞定!

但是没过一秒钟就觉得这话说早了,标题栏没了,窗体怎么移动啊?

别急,车到山前必有路,我们不妨骗骗Windows。当我们的鼠标在窗体任意位置上拖动鼠标时,让Windows以为鼠标在标题栏上拖动,不就可以实现任意点击窗体