《duilib入门到精通》- 如何新建一个duilib项目

上一节课,我们介绍了,如何下载编译运行duilib,这一课我们学习一下,如何创建一个新的duilib项目。

创建项目目录

我们定位到上节课下载的源码目录,在Duilib_Ultimate目录下新建一个Projects的文件夹,用来存放我们的项目。

创建基础的Win32项目

第一步、打开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项目,编译运行可以看到项目一闪而过。

引入配置duilib库

第一步、首先打开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项目

关于duilib开源项目

1、下载地址:
github:https://github.com/qdtroy/DuiLib_Ultimate
gitee(码云):https://gitee.com/qdtroy/DuiLib_Ultimate

2、学习交流:
作者QQ:656067418
邮箱: [email protected]
QQ交流群:261851826、261675375、 199950533、261674268

专栏文章

1.《duilib入门到精通》- duilib概述
2.《duilib入门到精通》- duilib下载与编译

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章