博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

VC模仿超炫QQ界面的实现

作者:Elio

源代码下载

  关键字: VC++ QQ界面 换肤 自绘控件 透明窗口 Vista样式 免费开发包 源码 模拟

  随着计算机技术的发展与普及,计算机逐渐走进了人们的日常生活当中。人们通过它来学习,娱乐,信息的交互等等.并且对应需而生的各种各样的软件产品的 要求也有了一定的提高。除了基本功能外,对软件易操作性,界面的美观性等也是一个成功软件必不可少的重要因素。美观个性化的界面是一个软件吸引和留住用户 的法宝之一,通讯软件QQ/MSN就是这类产品中的一个典型的代表,下面将用VC++对QQ的界面进行模拟实现,供广大朋友参考。
  相信各位对QQ已经相当熟悉,因此对其外观特性等不作累叙.我们将选用Visual C++来进行进行实现。在这之前,有必要向读者介绍一下大体情况。
  其实,整个过程最重要的部分是个性化界面自绘部分,也是难度最大的部分。关于界面编程方面的知识,诚然这是一个较为大的体系结构,我们不能奢求通过简 短的篇幅就能对它进行较为全面的描述,并且现在软件开发行业也有缩短开发周期,提高开发效率的趋势,于是将这一难度问题借用外在控件协助我们完成。
  关于换肤控件的选择,这里也向大家简单介绍一下,当然这只是个人的观点,仅供参考了解。当前市场提供多个换肤出名的换肤产品 (SkinMagic,Skin++,USkin,AppFace,SkinCrafte,等),其中SkinMagic,AppFace,USkin等 都是做得比较马虎的,界面的某些元素效果做得让人不太满意.而Skin++和SkinCrafte在这方面做得比较出色.客观的说Skin++目前应该 说,是国内较为出色的产品,其占用资源消耗比俄国产品SkinCrafte要出色,而俄国产品SkinCrafte在外观性能上做到的效果比Skin++ 要优秀点,COOL一点。
  虽然如此,本实现没有选用以上任何一产品,原因是这里有一个新起之秀SkinBeauty,它无论是性能和外观做出的效果都比较嚣张,更甚的是宣称提供良好的键盘操作支持同时并号称在Win2K和XP等系统可以做出Vista的玻璃磨沙效果。
  当然,这些都是所谓的比较结果而已,还有一个选用SkinBeauty的原因是:SkinBeauty可以使用自带的皮肤编辑软件(SkinBeauty Studio)实现一套皮肤包含多种样式的窗口界面,按钮样式等。这是以上任何一个产品暂时似乎都不能提供的。而我们这个项目的需求也有此(主界面,聊天对话框窗口不同,并有多个不同特性的按钮等细节问题)。

经过了前面的简单描述,接下来将开始具体的实现了。先看一下目标效果,如图:

0.准备工作:

  用产品相应的皮肤编辑软件SkinBeautyStudio编辑好界面各元素皮肤,一般好看的界面都是由图片绘制所成(这里是到其主站下载已有的 BeautyQQ.bsk皮肤)。将下载好的换肤开发库(SkinBeauty.dll,SkinBeauty.lib)和接口文件 SkinBeautyExport.h准备好,下载地址在本文章后有给出,或自己到www.afe-soft.com上自己下载。

1.建立项目:

打开VC++,利用向导帮助建立基于MFC的对话框项目BeautyQQ,过程如下
New-> Projects -> MFC AppWizard(exe) -> Dialoag based 其他默认完成建立。简单的修改一下对话框的大小,标题栏名称等,编译一下,如图:

运行一下基本正常,这就算完成了项目的创建工作了。

2.加载换肤库

  做好基本框架后,界面还是很土,运行效果难以让人满意,于是我们接下来可以加载换肤库,初步改变程序的界面外观了。
将先前准备好的skinBeauty.dll库放在项目的运行目录,在项目的目录放入SkinBeautyExport.h文件和 SkinBeauty.lib文件,以便稍后引入并调用函数接口。(一般DLL库的调用分成静态调用和程序运行期间动态调用2种,关于这两种的区别,可参 考其他文章。这里,我们将选用静态调用的方式实现)

在适当的位置添加引入库的声明,这里我们选择在stdafx.h文件里面添加:

//inside stdafx.h

//SkinBeauty Lib Call
#include "SkinBeautyExport.h"
#pragma comment(lib,"SkinBeauty.lib")
  在项目得初始化位置(这里选择在项目的创建实例cpp文件里面,BeautyQQ.cpp的CBeautyQQApp::InitInstance()函数的开始,一般都可以在此加载)加入皮肤加载的代码:
BOOL CBeautyQQApp::InitInstance()
{
CString exeFullPath;
CString strFilename;
int nLen = GetModuleFileName(NULL, exeFullPath,MAX_PATH);
CString strPath(exeFullPath);
strPath = strPath.Left(strPath.ReverseFind('\\'));
strFilename = strPath +_T("\\beautyQQ.bsk");

SkinLoad(THCAR2char(strFilename.GetBuffer(0)));
......
}
  从上面可知,我们先用GetModuleFileName()获取加载皮肤的路径,然后调用提供的函数接口SkinLoad()实现换肤库的加载。而SkinLoad()函数的参数也比较容易理解,就是皮肤所谓位置的路径。它的原型可以在头文件找到:
//load the skin with a skin-file from a path.
//[IN]:absolute file path
BOOL SkinLoad(char* szSkinPath);
至此,已经完成换肤库的加载了。运行看看效果是不是眩了很多,呵呵。
顺便说一下的是,官方声称,调用完SkinLoad()载入后,在退出程序前并不需要调用任何卸载函数,换肤引擎将自动实现库的销毁拆装等操作,除非你程序运行中途意愿性的想去掉皮肤外观。

  现在已经完成QQ主界面的外观实现与美化了,接下来我们通过VC向导添加一个对话框资源并添加相应的类,命名CtalkDlg类,其功能是聊天对话框 的对话窗口,也就是当我们双击用户列表的其中一个用户后弹出的聊天窗口.当我们运行的时候发现,它的窗口背景外观除了大小外,其它跟主界面是完全一样的, 怎么办呢?没有关系,因为在皮肤文件里面已经编辑和准备好另一外观的窗口皮肤资源,我们只需要将这个聊天对话框创建后跟这个皮肤资源绑定则可,重载这个 CtalkDlg类的初始化函数,并添加绑定代码,具体实现如下:

BOOL CTalkDlg::OnInitDialog() 
{
CDialog::OnInitDialog();


//将该对话框绑定某资源ID,让其绘制根据该资源定义来实现
//bind with the predefine res
BindRes2CtrlbyHWND(103,m_hWnd);
......
}
  上述代码功能是将预先在beautyQQ.bak皮肤里面定义好的对话框图像资源与对话框绑定,资源内部ID号为103(注意,该资源编号是编辑皮肤 的时候就是由用户定义的,一般从101开始)。从上面的BindRes2CtrlbyHWND()函数名称以及参数可知道,功能是将窗口句柄为 m_hWnd的窗口外观与资源Id为103的皮肤资源绑定.于是,这就实现了不同窗口可以显示不同的背景皮肤了。
  跟这个功能相类似的是,我们聊天对话框有好几个按钮,它们拥有不一样的外观,按理也应该绑定指定需要的外观皮肤资源,于是,我们可以采用以下函数接口实现:
BindRes2CtrlbyID(106,IDC_BUTTON_TALK_SERACH);

   以上语句是将皮肤资源ID为106的皮肤跟程序资源ID为IDC_BUTTON_TALK_SERACH的搜索按钮相绑定,该函数接口可以在程序运行前 面预先将某控件与指定的皮肤资源相绑定,提供的是控件资源ID与皮肤资源ID。当然也可以用句柄的方式绑定,跟前面的 BindRes2CtrlbyHWND()不同的是,大多数对话框窗口在运行期间没有固定的控件资源ID的概念(不象button,edit等控件),所 以只能使用实时句柄HWND的形式进行绑定。前面两个资源绑定函数的原型在SkinBeautyExport.h头文件里面可以找到,如下:

//bind a skin_resource with a Ctrl by Ctrl ID or by handle
//[IN]:user resource define in the skin-file; the ID/handle of Ctrl to be set
void BindRes2CtrlbyID(int nUserResID,DWORD dwCtrlID);
BOOL BindRes2CtrlbyHWND(int nUserResID,HWND hWnd);
  好,经过上面的描述后,对照附件的源码,对于QQ的菜单,用户列表等实现已经不是那么困难了,用户只需象正常的菜单和ListCtrl那样使用就可以了,运行的时候换肤库自动会将他们的外观美化起来。读者可下载源码,看它是怎么绑定实现的。
基本整个复杂而超眩的项目就在完成向导创建后调用两到三个第三方接口函数中完成。坦白说,整个换肤开发包提供的接口函数相当简练,就10多个,功能与使用 方法亦是相当明了,相信无需多研究就知道如何使用;如果对这几个接口函数有什么疑问,可以参考官方提供的开发文档说明书。
  其实上面的例子跟商家提供的源码类似,只是本人将其实现过程解释出来而已,希望对做界面的朋友有参考作用。开始我是对使用商家界面换肤产品的行为比较 反感,后来发现效果和效率还凑和,就算了,并在商家的鼓励下写了篇文章帮他们介绍给读者认知,换取了一个企业版本的开发包。算是“个人利益跟群众利益结 合”吧,的确不错的,大家可以测试。不过我想对国内某些用户不太满意的是,目前SkinBeauty的使用文档是英文著写的,暂时没有中文版本,这对部分 不动E文的朋友有点不方便罢了。
搞界面开发的,建议多下载几个换肤产品看看其性能,如资源占用,做到的效果,键盘操作性等。

结语

  在尤为强调效率的时代,不妨考虑使用可信赖的第三方控件,将繁杂而固化的实现扔给它们来处理,深入产品功能业务,站在别人的肩膀上,再优化自身,从而走得更高更远。

参考文章

  • 使用换肤开发包SkinBeauty开发商主页:www.afe-soft.com
  • 开发包(免费版本)下载地址: http://www.afe-soft.com/downloadcenter.htm
  • 开发文档下载地址: http://www.afe-soft.com/downloadcenter.htm
    (免费版本是无Logo,无弹出窗口限制的,这点可以给部分做共享的朋友点方便了,估计,当然,如果要性能好,不完全受限还是需要获取企业版本了..天下没有免费的午餐,天下乌鸦一般黑?…呵呵,还是不损得太厉害了)
来源:http://www.vckbase.com/document/viewdoc/?id=1841

 

 VC 6.0 编译 cannot open file "uafxcwd.lib"

 

 

最近在编译一个软件源代码的时候出现一个问题
cannot open file "uafxcwd.lib"
我在网上收集相关的解决方案.
1.
菜单project-》settnigs-》link-》Object/Library   modules:中添加uafxcwd.lib   
 2.
  如果还是不行,选择vc的全部安装,而不是默认安装
如果是unicode,可以用vc盘修复一下vc,钩选相关项。
我自己是把vc盘里面的lib复制到vc mfc lib里面而不是重新安装
开始写了一篇没保存 这是第二次写
附件里面是需要的"uafxcwd.lib"文件

附件下载:
  uafxcwd.lib
  uafxcwd.lib
 

 

posted on 2010-07-11 13:40  Likwo  阅读(1881)  评论(2编辑  收藏  举报