上一節課,我們介紹了,如何下載編譯運行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