http://www.cppblog.com/everett/archive/2012/05/21/175515.html
金山卫士开源后,很多时候,并没有去关注功能的实现,而对其使用的界面库产生了兴趣。做界面一直不是自己的强项,考虑能研究研究,说不定能在公司产品中用上。
KUI(Kingsoft UI,网上都这么叫)。
今天目标:按照下面的步骤,使用KUI开发一个基本的对话框程序。
平台:Windows
工具:Visual Studio 2008 SP1 (非Express版本)
首先,我们创建个文件夹,假设E:\mykui。并创建几个文件夹,存放下载的文件及我们的第一个项目工程。
KUI库文件
1、WTL
(其实WTL库完全可以从金山开源的代码中找到,这里主要是为了能给VS添加个工程向导。)
a、下载、解压
网站:http://sourceforge.net/projects/wtl/
稳定版本是2007年的WTL80,不过,WTL一直处于维护之中,可以Browse All Files。
现在最新版WTL81:
http://sourceforge.net/projects/wtl/files/WTL%208.1/WTL%208.1.12085/
下载解压得到:
b、安装VS2008向导
进入解压后的目录中AppWiz目录,双击setup90.js,提示成功。
这时打开VisualStudio2008,及可看到向导了。
注:安装完成后,wtl81_12085\AppWiz目录就不能换位置了,否则向导就无法运行了。(记得一天qq群里有人问,顺便这里提下)
2、KUI文件提取
a) 金山卫士开源计划网站http://code.ijinshan.com/
下载压缩包:http://code.ijinshan.com/download/tip.tar.bz2
解压:
b) 获取KUI所需文件
我们所需的大部分文件都在这里:E:\mykui\downloadfiles\kingsoft\oss\pcmanager\src\publish
把这个目录下的几个文件夹复制到工程的publish目录下。
把 |
复制到E:\mykui\project\publish\ |
bkres |
bkres |
bkwin |
bkwin |
tinyxml |
tinyxml |
wtl |
wtl |
如果想使用新下载的wtl库,那就复制新的。
把 |
复制到 |
E:\mykui\downloadfiles\wtl81\wtl81_12085\Include |
E:\mykui\project\publish\wtl |
开始创建第一个程序
1. 使用WTL向导创建一个对话框项目HelloKUI。
确定后,会有这个警告,确定即可。
目录结构如此:
2. 配置“C/C++包含目录”和“资源包含目录”
资源,也是“所有配置”。
3. 修改stdafx.h文件,包含KUI基本的头文件。
注意黄色背景部分。
// stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #pragma once // Change these values to use different versions #define WINVER 0x0500 #define _WIN32_WINNT 0x0501 #define _WIN32_IE 0x0501 #define _RICHEDIT_VER 0x0200 #include <atlbase.h> #include <atlwin.h> #include <atlstr.h> #include <atltrace.h> #define _WTL_NO_CSTRING #include <wtl/atlapp.h> #include <wtl/atlframe.h> #include <wtl/atlctrls.h> #include <wtl/atlctrlx.h> #include <wtl/atldlgs.h> #include <wtl/atlcrack.h> #include <wtl/atlmisc.h> #include <tinyxml/tinyxml.h> #include <bkwin/bkdlgview.h> #include <bkres/bkres.h> extern CAppModule _Module; #if defined _M_IX86 #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") #elif defined _M_IA64 #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"") #elif defined _M_X64 #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") #else #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") #endif |
4. HelloKUI工程中添加文件bkwinres.h和bkwinres.rc2
这两个文件是使用KUI界面库的工程必备的文件,且文件名也必须这么叫,用于定义资源ID、关联ID与资源并产生资源文件。(见bkres\bkres.h)
5. 将bkres\bkres.rc添加到工程中。
6. 修改HelloKUI.rc文件。
修改#include "atlres.h" 为 #include "wtl\atlres.h"。
这时,可以先编译一下,是可以编译通过的。
7. 添加tinyxml到工程中,并将tinyxml的cpp文件修改为“不使用预编译头”。
8. 在bkwinres.rc2中定义并添加xml资源描述文件
// file : bkwinres.rc2 // xml DEFINE_XML(IDR_BK_SKIN_DEF, 100, "res\\xml\\def_skin.xml") DEFINE_XML(IDR_BK_STYLE_DEF, 101, "res\\xml\\def_style.xml") DEFINE_XML(IDR_BK_STRING_DEF, 102, "res\\xml\\def_string.xml") DEFINE_XML(IDR_BK_MAIN_DIALOG, 103, "res\\xml\\dlg_main.xml") |
在E:\mykui\project\HelloKUI\HelloKUI\res\xml 下创建这几个空xml文件。(内容稍后再加)
9. 修改WinMain函数(HelloKUI.cpp)
在对话框显示之前,增加以下代码。
BkString::Load(IDR_BK_STRING_DEF); BkFontPool::SetDefaultFont(_T("宋体"), -12); BkSkin::LoadSkins(IDR_BK_SKIN_DEF); BkStyle::LoadStyles(IDR_BK_STYLE_DEF); int nRet = 0; // BLOCK: Run application { CMainDlg dlgMain; nRet = dlgMain.DoModal(); } |
10. 修改MainDlg.h与MainDlg.cpp
将MainDlg.h的全部内容替换为下面。(剩余功能一步一步加)
// MainDlg.h : interface of the CMainDlg class // ///////////////////////////////////////////////////////////////////////////// #pragma once class CMainDlg : public CBkDialogImpl<CMainDlg> { public: CMainDlg() : CBkDialogImpl<CMainDlg>(IDR_BK_MAIN_DIALOG) { } }; |
那么,对应的MainDlg.cpp文件中的相关函数一起去掉。
// MainDlg.cpp : implementation of the CMainDlg class // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "resource.h" #include "MainDlg.h" |
11. xml文件中的内容添加
def_string.xml |
<string> </string> |
def_skin.xml |
<skins> </skins> |
def_style.xml |
<style> <style> |
dlg_main.xml |
<layer title="HelloKUI" width="800" height="600" appwin="1" resize="1"> </layer> |
12. 终于可以运行
编译程序,可以直接运行了。
运行后,程序显示一个黑色背景的对话框。无法关闭。
停止调试(或者结束进程)吧。
13. 添加控件及事件响应
// todo : 目标二
14. xml资源介绍及美化
// todo : 目标三
样例程序下载
http://download.csdn.net/detail/everettjf/4316879
参考资料
KUI中xml元素定义与代码中类的对应:
http://www.cppblog.com/everett/archive/2012/02/18/165907.html
结束语
a hardwork but value .