《DuiLib学习》--创建一个duilib项目

参考链接:
参考1
参考2
再按照两位大神的项目创建过程中出了一些小问题,特此记录下~

1.创建项目目录

​ 在桌面上新建一个文件夹 (MyDuilib),用来做我们项目的根目录。
在这里插入图片描述

2.创建一个Win32项目

1.打开VS2013,新建一个 Win32项目,项目目录选择上一步创建的文件夹 (MyDuilib) ,项目配置选择 Windows 应用程序,点击完成即可。

在这里插入图片描述
在这里插入图片描述
2.在解决方案管理器里找到我们刚才创建的DuilibDemo项目,打开DuilibDemo.cpp,保留_tWinMain函数,把其它代码删掉,删除完毕留下的代码如下(可直接复制)

在这里插入图片描述

#include "stdafx.h"
#include "DuilibDemo.h"

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

	return (int) 0;
}

此时编译运行会发现项目一闪而过

3.引入配置duilib库

1.将duilib库整个文件夹复制到项目同级目录下(即MyDuilib)

在这里插入图片描述
2.在项目同级目录下(MyDuilib)创建一个文件夹(Lib),将Duilib_d.exp和Duilib_d.lib复制到Lib下

ps:编译Duilib源码,会在lib文件下生成Duilib_d.exp和Duilib_d.lib(debug调试)/Duilib.exp和Duilib.lib(release调试)

亲测!!!不放置会产生error
在这里插入图片描述
3.在解决方案管理器里打开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")
/********************************************/
//上述部分分可以只用如下一句话代替亦可
#pragma comment(lib, "..\\..\\Lib\\Duilib.lib")
#endif

4.在解决方案管理器里打开DuilibDemo.cpp,初始化duilib库:配置duilib管理器,设置资源路径,启动duilib消息循环

在这里插入图片描述
在这里插入图片描述
同时在执行目录(DuilibDemo项目文件夹)下的Debug下新建一个Skin文件夹 (资源路径)
在这里插入图片描述
----------------error 1 happen------------------

// 程序实例
	CPaintManagerUI::SetInstance(hInstance);
	// 配置资源路径
	// 资源类型
	CPaintManagerUI::SetResourceType(UILIB_FILE);
	// 资源路径:执行程序同目录的Skin文件夹下
	// CPaintManagerUI::GetInstancePath() 执行程序目录
	CDuiString sResourcePath;
	sResourcePath.Format(_T("%sSkin"), CPaintManagerUI::GetInstancePath());
	CPaintManagerUI::SetResourcePath(sResourcePath);

	// 启动消息循环
	CPaintManagerUI::MessageLoop();

此时初始化完成,尝试运行一下程序,会提示缺少Duilib_d.dll。

5.把duilib库生产的Duilib_d.dll,复制到例子执行目录(DuilibDemo项目文件夹)下的Debug下。
在这里插入图片描述
此时再运行,程序正常运行,没有显示也没有退出,因为我们还没有创建窗口。

在这里插入图片描述

4.创建自己的duilib窗口类

1.在项目DuilibDemo上右击 -> 添加 -> 添加类MyMainWnd,这里的类需要继承基类WindowImplBase,并重写WindowImplBase中的三个函数:

GetSkinFile:返回窗口皮肤文件名称(导入xml页面)

GetWindowClassName:返回窗口类名

Notify:事件监听
在这里插入图片描述
在这里插入图片描述
打开MyMainWnd.h,写入以下代码

------------error 2 happen---------

#pragma once
class MyMainWindow :public WindowImplBase, public CWebBrowserEventHandler
{
public:
	MyMainWindow();
	~MyMainWindow();

	virtual CDuiString GetSkinFile();
	virtual CDuiString GetSkinFolder();//注意!!! 一定要写这个!!!
	virtual LPCTSTR GetWindowClassName(void) const;
	virtual void Notify(TNotifyUI& msg);
};

打开MyMainWnd.cpp,写入以下代码

#include "stdafx.h"
#include "MyMainWindow.h"


MyMainWindow::MyMainWindow()
{
}


MyMainWindow::~MyMainWindow()
{
}

CDuiString MyMainWindow::GetSkinFile()
{
	return _T("main.xml");// 名字可以按照窗口类名字取
}

CDuiString MyMainWindow::GetSkinFolder()
{
	return CDuiString(CPaintManagerUI::GetInstancePath());
}

LPCTSTR MyMainWindow::GetWindowClassName(void) const
{
	return _T("MyMainWnd"); // 名字可以按照窗口类名字取
}

void MyMainWnd::Notify(TNotifyUI& msg)
{
	WindowImplBase::Notify(msg);
}

5.从主函数入口打开窗口

解决方案管理器里打开DuilibDemo.cpp,写入以下代码并添加头文件

	MyMainWnd* pMainWnd = new MyMainWnd();
	// 创建窗口
	pMainWnd->Create(NULL, _T("LoveDuilib"), WS_POPUP | WS_VISIBLE, 0);
	// 窗口居中显示
	pMainWnd->CenterWindow();

此时运行运行程序会提示缺少xml文件
在这里插入图片描述

6.创建xml文件

项目右键 -> 添加 -> 添加新项main.xml,记得放在Skin文件夹中
在这里插入图片描述
复制一份简单的xml代码到新建的main.xml中

<?xml version="1.0" encoding="utf-8"?>
<Window size="800, 600" caption="0,0,0,30">
  <VerticalLayout bkcolor="#ffffeeee" childvalign="vcenter" childalign="center">
    <Button name="closebtn" bkcolor="#ffff0000" width="200" height="80" text="关闭窗口"/>
  </VerticalLayout>
</Window>

运行程序
在这里插入图片描述
点击关闭窗口后窗口关闭了,但程序还在运行,需要添加监听事件来终止程序。
在这里插入图片描述

7.error 汇总

1.error 1:
在这里插入图片描述
原因:字符集异常 在这里插入图片描述

解决:更改调试环境的字符集
在这里插入图片描述
2.error 2:
在这里插入图片描述
原因
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解决:将继承父类的形如virtual CDuiString GetSkinFolder() = 0;需要实现的方法在子类中全要实现

3.error 3:
在这里插入图片描述
原因:因为Add class的时候原博客图片异常,所以未继承类public WindowImplBase ,在调用WindowImplBase::Notify(msg);的时候就会报此错误
在这里插入图片描述
解决:添加基类public WindowImplBase ,补好了缺失的图

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值