上一节课,我们介绍了,如何下载编译运行duilib,这一课我们学习一下,如何创建一个新的duilib项目。
我们定位到上节课下载的源码目录,在Duilib_Ultimate目录下新建一个Projects的文件夹,用来存放我们的项目。
第一步、打开VS2010,新建一个“Win32项目”,项目目录选择上一步创建的Projects文件夹,项目配置选择”Windows 应用程序“,点击完成即可,一个最简单的Win32窗口项目就创建好了。这里可以直接编译运行一下,可以看下运行效果,方便稍后和duilib例子对比一下。
第二步、在解决方案管理器里找到我们刚才创建的LoveDuilib项目,打开LoveDuilib.cpp,保留_tWinMain函数,把文件内的其它代码删掉,删除完毕留下的代码如下:
#include "stdafx.h"
#include "LoveDuilib.h"
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
return (int)0;
}
这是一个只保留入口函数的Win32项目,编译运行可以看到项目一闪而过。
第一步、首先打开StdAfx.h,包含duilib库头文件,引入命名空间,导入lib库:
// 包含库头文件
#include "../../../Duilib/UILib.h"
// 引入命名空间
using namespace DuiLib;
// 导入lib库
#ifndef _DEBUG
// Release版本的库
#pragma comment(lib, "..\\..\\..\\Lib\\Duilib.lib")
#else
// Debug版本的库
#pragma comment(lib, "..\\..\\..\\Lib\\Duilib_d.lib")
#endif
// 复制Duilib_d.dll 到新建项目执行程序目录
第二步、初始化duilib库:配置duilib管理器,设置资源路径,启动duilib消息循环
// 程序实例
CPaintManagerUI::SetInstance(hInstance);
// 配置资源路径
// 资源类型
CPaintManagerUI::SetResourceType(UILIB_FILE);
// 资源路径:执行程序同目录的Skin文件夹下
// CPaintManagerUI::GetInstancePath() 执行程序目录
CDuiString sResourcePath;
sResourcePath.Format(_T("%sSkin"), CPaintManagerUI::GetInstancePath());
CPaintManagerUI::SetResourcePath(sResourcePath);
// 大家猜猜这里应该放什么代码?
// 启动消息循环
CPaintManagerUI::MessageLoop();
这些初始化完成以后,按F5看下效果:此时提示缺少Duilib_d.dll,我们把duilib库生产的dll,复制到例子执行目录下。复制以后,再按F5看下效果:程序没有任何显示,也没有退出,这就对了,因为我们没有创建窗口,只是创建了消息循环,让程序不立即退出。
第三步、创建duilib窗口:资源引入,消息处理
在LoveDuilib项目右键,点击添加类CMainWnd,duilib中窗口类都需要从WindowImplBase类继承,这里的基类也要填写WindowImplBase,点击创建,在项目里就可以看到创建的主窗口类了。继承的窗口都需要实现以下必须实现的接口(纯虚接口):
1、GetSkinFile 返回窗口皮肤文件名称
2、GetWindowClassName 返回窗口类名
#pragma once
class CMainWnd : public WindowImplBase
{
public:
CMainWnd(void);
virtual ~CMainWnd(void);
public:
virtual CDuiString GetSkinFile();
virtual LPCTSTR GetWindowClassName(void) const;
void Notify(TNotifyUI& msg);
};
#include "StdAfx.h"
#include "MainWnd.h"
CMainWnd::CMainWnd(void)
{
}
CMainWnd::~CMainWnd(void)
{
}
CDuiString CMainWnd::GetSkinFile()
{
return _T("main.xml");// 名字可以按照窗口类名字取
}
LPCTSTR CMainWnd::GetWindowClassName(void) const
{
return _T("MainWnd"); // 名字可以按照窗口类名字取
}
void CMainWnd::Notify(TNotifyUI& msg)
{
WindowImplBase::Notify(msg);
}
窗口类创建完成以后,就可以在入口函数里面实例化我们的主窗口了。
// 大家猜猜这里应该放什么代码?
CMainWnd* pMainWnd = new CMainWnd();
// 创建窗口
pMainWnd->Create(NULL, _T("LoveDuilib"), WS_POPUP | WS_VISIBLE, 0);
// 窗口居中显示
pMainWnd->CenterWindow();
实例完成以后,按F5看下效果,提示缺少main.xml,因为我们并没有创建这个main.xml。下面我们创建一下main.xml,还是项目右键,添加xml文件。xml内容我先添加一个最基础的窗口控件,此时运行项目就可以看到一个灰色窗口和一个红色关闭按钮。
<?xml version="1.0" encoding="utf-8"?>
<!--这些属性什么含义,我们后面课程再介绍-->
<Window size="800, 600" caption="0,0,0,30">
<VerticalLayout bkcolor="#ff888888" childvalign="vcenter" childalign="center">
<Button name="closebtn" bkcolor="#ffff0000" width="100" height="30" text="关闭窗口"/>
</VerticalLayout>
</Window>
我们在窗口类里面添加一下关闭按钮事件,点击关闭按钮,关闭窗口退出程序。到此一个最简单的duilib程序也就创建完成了。
void CMainWnd::Notify(TNotifyUI& msg)
{
// 消息类型
if(msg.sType == _T("click")) {
// 控件名称
CDuiString sName = msg.pSender->GetName();
if(sName == _T("closebtn")) {
Close(IDOK);
// 如果不加这句,窗口关闭了,但程序不会退出
PostQuitMessage(0);
return;
}
}
WindowImplBase::Notify(msg);
}
如何新建一个duilib项目
1、下载地址:
github:https://github.com/qdtroy/DuiLib_Ultimate
gitee(码云):https://gitee.com/qdtroy/DuiLib_Ultimate
2、学习交流:
作者QQ:656067418
邮箱: qdtroy@qq.com
QQ交流群:261851826、261675375、 199950533、261674268