《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下載與編譯

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