您的位置:首页 > 产品设计 > UI/UE

Duilib 入门

2016-01-07 14:13 579 查看
要使用duilib库,必须把库导入,代码如下:

1 #include “xxxUIlib.h“//xxx为UIlib.h的路径

2 using namespace Duilib; //Duilib为库自定义的名字空间

3

4 #ifdef _DEBUG

5 #ifdef _UNICODE

6 #pragma comment(lib, “xxxDuilib_ud.lib”)

7 #else

8 #pragma comment(lib, “xxxDuilib_d.lib”)

9 #endif

10 #else

11 #ifdef _UNICODE

12 #progma comment(lib, “xxxDuilib_u.lib“)

13 #else

14 #progma comment(lib, “xxxDuilib.lib“)

15 #endif

使用duilib库的程序和win32程序一样也是从winmain开始的,在winmain函数中,一般是这样的:

1,CPaintManagerUI::SetInstance(hInstance); //将程序实例与皮肤绘制管理器挂钩。

2,CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath); //获取可执行程序的所在路径,指的是.exe文件路径

3,CPaintManagerUI::SetResourceZip(/*路径*/); //皮肤库支持压缩文件,这里指定压缩文件路径。

4,//new一个类,这个类继承自CWindowWnd类。

5,调用类的Create函数创建窗口,这里会发送WM_CREATE消息,而这个类一般会在HanderMessage函数中处理WM_CREATE消息。

6,//创建完窗口后,可以调用该类的SetIcon(IDI_HW)函数来设置任务栏上显示的图标。

7,然后调用CPaintManagerUI::MessageLoop(),进入消息循环。

在duilib中每个窗口均要定义一个CPaintManagerUI成员对象用来管理整个窗口的绘制。
duilib中的窗口均继承自CWindowWnd类,在CWindowWnd类中有虚函数HandleMessage来处理Windows消息(如WM_CREATE,WM_SIZE等)。另外,如果你的窗口想要响应鼠标的点击、编辑框内容改变等消息的话,可以把你的窗口类继承INotify接口,这样你的窗口上的一个按钮被点击了,可以在继承自INNotify(事件通知抽象类)接口的Notify函数中进行处理。

在自己定义的窗口类中一般这样来处理HandleMessage:

1 LRESULT CHelloWorld::HandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam )

2 {

3 LRESULT lRes = 0;//返回值

4 BOOL bHandled = TRUE;//是否被处理了

5 switch (uMsg)

6 {

7 case WM_CREATE:

8 lRes = OnCreate(uMsg ,wParam, lParam, bHandled);

9 break;

10 default: //消息没有被处理

11 bHandled = FALSE; break;

12 }

13

14 if (bHandled) return lRes; //处理了,函数就返回,没有处理的话,就调用窗口消息及图形绘制管理器类(CPaintManagerUI)来处理

15 if (m_pm.MessageHandler(uMsg, wParam, lParam, lRes) != 0)//没有处理,这传送给窗口绘制管理器处理,Notify函数将会在这里的m_pm.MessageHandler函数中被调用

16 return lRes;

17 return CWindowWnd::HandleMessage(uMsg, wParam, lParam);//都不处理则有CWindowWnd处理

18 }

INotifyUI(事件通知抽象类)接口的Notify()由CPaintManagerUI::MessageHandler调用,继承INotifyUI接口的类对象会被加入到CPaintManagerUI的m_aNotifiers数组中,而要加入m_aNotifiers数组一般由窗口类自己在OnCreate函数调用CPaintManagerUI的静态方法AddNotifier将自己加入到m_aNotifiers中。

而在自己的窗口类的OnCreate函数中,通常调用m_pm_Init(m_hWnd)来把自己的窗口句柄与窗口绘制管理器挂接在一起,用于向CPaintManagerUI提供窗口句柄及窗口上下文句柄。

1 LRESULT CHelloWorld::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL&bHandled)

2 {

3 m_pm.Init(m_hWnd); // 把自己的窗口句柄与窗口绘制管理器挂接在一起

4 CDialogBuilder builder;

5 CControlUI* pRoot = builder.Create(TEXT(“HelloWorld.xml“), (UINT)0, NULL, &m_pm); // 根据xml中的配置创建控件

6 ASSERT(pRoot && “Failure to parse XML“);

7 m_pm.AttachDialog(pRoot); // 把这些控件绘制到本窗口上

8 m_pm.AddNotifier(this); // 把自己加入到CPaintManagerUI的m_aNotifiers数组中,用于处理Notify函数

9 Init();

10 return 0;

11

12 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: