标签:int lib oid 事件处理 .dll resource size notify result
My first Duilib program
1. Prepare for development
打开DuiFarm项目DuiFarm.cpp文件,将除_tWinMain函数之外所有内容删除。删除后的DuiFarm.cpp内容如下:
int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow) {return 0;}
在DuiFarm.cpp文件首引入头文件UIlib.h,并引用namespace,以及其他相关宏。
#include "..\\..\\duilib-master\\DuiLib\\UIlib.h" using namespace DuiLib; #ifdef _DEBUG #ifdef _UNICODE #pragma comment(lib,"..\\..\\duilib-master\\Lib\\Duilib_ud.lib") #else #pragma comment(lib,"..\\..\\duilib-master\\Lib\\Duilib_d.lib") #endif #else #ifdef _UNICODE #pragma comment(lib,"..\\..\\duilib-master\\Lib\\Duilib_u.lib") #else #pragma comment(lib,"..\\..\\duilib-master\\Lib\\Duilib.lib") #endif #endif
这样,Duilib已经成功集成在项目DuiFarm项目中了。注意作者项目的文件结构,引用Duilib.h与Duilib_x.lib文件使用相对路径必须正确(,相对路径以DuiFarm下Debug目录内为参照)。
在编写其他代码之前,需要明确几个知识点。Duilib的几个内置对象。
2.Starting coding "Hello World"
在DuiFarm.cpp中新建类DuiFarm,继承自CWindowWnd与INotifyUI,重写CWindowWnd的虚函数GetWindowClassName、HandleMessage与INotify的虚函数Notify。代码如下:
class DuiFarm: public CWindowWnd, public INotifyUI { protected: CPaintManagerUI m_PaintManager; public: virtual LPCTSTR GetWindowClassName() const {/*some code*/} virtual void Notify(TNotifyUI& msg) {/*some code*/} virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) {/*some code*/} };
其中三个函数的主要功能:
首先补全GetWindowClassName函数的代码,在函数体内,直接返回窗体名字符串。
virtual LPCTSTR GetWindowClassName() const {return _T("DuiFramFrame");}
HandleMessage函数中补全对窗体创建等消息的处理。
1 virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) 2 { 3 LRESULT lRes = 0; 4 if( uMsg == WM_CREATE ) 5 { 6 m_PaintManager.Init(m_hWnd); 7 CDialogBuilder builder; 8 CControlUI *pRoot = builder.Create(_T("dui-design.xml"),(UINT)0,NULL,&m_PaintManager); 9 ASSERT(pRoot&&"### XML error!"); 10 m_PaintManager.AttachDialog(pRoot); 11 m_PaintManager.AddNotifier(this); 12 return lRes; 13 } 14 if( m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes)) 15 { 16 return lRes; 17 } 18 return __super::HandleMessage(uMsg, wParam, lParam); 19 }
第4行在消息为窗体创建(WM_CREATE)时,执行:
执行完上述代码,窗体即绘制完成,事件通知已可用。在上述代码中,第8行加载xml文件即为duilib的界面设计xml。犹如html之于浏览器,dui通过解析xml将控件绘制到窗体上。
xml文件如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <Window size="100,100"> 3 <HorizontalLayout bkcolor="#FFFFFF00"> 4 <Button name="btnHello" text="Hello World :-)"/> 5 </HorizontalLayout> 6 </Window>
将文件保存到项目Debug目录下(因当前项目以Debug模式运行)。这段xml描述了窗体的整体布局:
现在窗体已经定义好,需要添加对按钮事件的处理。根据上一篇介绍,按钮事件处理要在重载的Notify函数中编写。
1 virtual void Notify(TNotifyUI& msg) 2 { 3 if(msg.sType==_T("click")) 4 { 5 if(msg.pSender->GetName()==_T("btnHello")) 6 ::MessageBox(NULL,_T("Hello World :-)"),_T("Hallo Welt :-D"),NULL); 7 } 8 }
编写到这里,项目已经具备窗口绘制、窗口布局和事件处理的基本功能,下面需要在入口函数中为之初始化与分配资源:
1 int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow) 2 { 3 CPaintManagerUI::SetInstance(hInstance); 4 CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()); 5 DuiFarm duiFarm; 6 duiFarm.Create(NULL, _T("Dui Farm"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE); 7 duiFarm.CenterWindow(); 8 duiFarm.ShowModal(); 9 return 0; 10 }
_tWinMain函数内容基本固定,后续如无特别说明,将不再列出_tWinMain代码。
在调试运行前,需要确认DuiLib[x].dll是否位于DuiFarm项目的Debug目录下(x为_d,_ud或不存在,根据项目编码以及是否为Debug模式而定)。
运行效果如下:
图2.2.1 显示窗体
如图,窗体显示黄色,而按钮实际上占据了整个窗体。点击按钮如下:
图2.2.2 点击按钮(按钮占据了整个窗体)
标签:int lib oid 事件处理 .dll resource size notify result
原文地址:http://www.cnblogs.com/sam-snow-v/p/6479570.html