DirectUI界面编程(二)绘制一个按钮
2015-07-18 19:57
417 查看
上节介绍了使用源码方式构建Duilib应用的项目配置,并创建了一个最简单的基于Duilib库的窗口,细心的读者会发现,当我们点击窗口的关闭按钮时,应用并没有真的退出,因为我们并没有对窗口事件进行处理,本节我们在窗口中绘制一个按钮并响应窗口及按钮的相关事件。
在窗口中绘制一个按钮我们需要以下几个步骤:
创建并初始化CPaintManagerUI对象,CPaintManagerUI类是Duilib库的绘图管理器,用于管理整个窗口的绘制。
创建CButtonUI对象,并调用CPaintManagerUI对象的AttachDialog函数将CButtonUI对象附加到CPaintManagerUI对象中。
调用CPaintManagerUI对象的AddNotifier为按钮指定消息处理类。
在WM_PAINT消息处理中调用CButtonUI对象的SetPos函数设置按钮的位置和大小。
案例代码如下:
在CMyWnd类中增加了两个成员属性m_PaintMgr和m_pCloseBtn,它们分别为CPaintManagerUI 类的对象和CControlUI对象指针。在CMyWnd类中我们重写父类的HandleMessage函数处理Windows窗口消息,重写Notify函数来处理自绘控件相关的消息。
在窗口创建消息WM_CREATE中调用CPaintManagerUI 类的Init函数初始化m_PaintMgr对象并创建按钮对象,將按钮附加到m_PaintMgr对象中。在CMyWnd 的Notify函数中处理按钮的点击事件。
编译运行效果如下:
博文源码:https://github.com/rongbo-j/duilib-tutorial
在窗口中绘制一个按钮我们需要以下几个步骤:
创建并初始化CPaintManagerUI对象,CPaintManagerUI类是Duilib库的绘图管理器,用于管理整个窗口的绘制。
创建CButtonUI对象,并调用CPaintManagerUI对象的AttachDialog函数将CButtonUI对象附加到CPaintManagerUI对象中。
调用CPaintManagerUI对象的AddNotifier为按钮指定消息处理类。
在WM_PAINT消息处理中调用CButtonUI对象的SetPos函数设置按钮的位置和大小。
案例代码如下:
#include <Windows.h> #include "../DuiLib/StdAfx.h" using namespace DuiLib; class CMyWnd : public CWindowWnd,public INotifyUI { public: CMyWnd(){} LPCTSTR GetWindowClassName() const { return L"MyWnd"; } UINT GetClassStyle() const{ return UI_CLASSSTYLE_FRAME|CS_DBLCLKS; } void Notify(TNotifyUI& msg) { //判断是否为点击事件 if(msg.sType == L"click") { //判断事件源名称是否为CloseBtn if(msg.pSender->GetName() == L"CloseBtn") { if(IDOK == ::MessageBox(NULL,L"退出程序?",L"提示信息",MB_OKCANCEL)) { ::PostQuitMessage(0); } } } } LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CREATE: { m_PaintMgr.Init(m_hWnd); //创建按钮 m_pCloseBtn = new CButtonUI(); m_pCloseBtn->SetName(L"CloseBtn"); m_pCloseBtn->SetBkColor(0xFFFF0000); m_pCloseBtn->SetText(L"关闭按钮"); m_pCloseBtn->SetVisible(true); m_PaintMgr.AttachDialog(m_pCloseBtn); m_PaintMgr.AddNotifier(this); } break; case WM_PAINT: { RECT rect = {100,100,200,150}; m_pCloseBtn->SetPos(rect); } break; case WM_DESTROY: ::PostQuitMessage(0); break; } LRESULT lRes=0; if(m_PaintMgr.MessageHandler(uMsg,wParam,lParam,lRes)) return lRes; return CWindowWnd::HandleMessage(uMsg,wParam,lParam); } ~CMyWnd(){} private: CPaintManagerUI m_PaintMgr; CControlUI* m_pCloseBtn; }; INT WinMain(HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpCmdLine,INT Show) { CPaintManagerUI::SetInstance(hInst); //创建主窗口 CMyWnd* pFrame = new CMyWnd(); pFrame->Create(NULL,L"Hello World!",UI_WNDSTYLE_FRAME,WS_EX_WINDOWEDGE); pFrame->CenterWindow(); //设置窗口大小 pFrame->ResizeClient(800,600); pFrame->ShowWindow(true); CPaintManagerUI::MessageLoop(); delete pFrame; return 0; }
在CMyWnd类中增加了两个成员属性m_PaintMgr和m_pCloseBtn,它们分别为CPaintManagerUI 类的对象和CControlUI对象指针。在CMyWnd类中我们重写父类的HandleMessage函数处理Windows窗口消息,重写Notify函数来处理自绘控件相关的消息。
在窗口创建消息WM_CREATE中调用CPaintManagerUI 类的Init函数初始化m_PaintMgr对象并创建按钮对象,將按钮附加到m_PaintMgr对象中。在CMyWnd 的Notify函数中处理按钮的点击事件。
编译运行效果如下:
博文源码:https://github.com/rongbo-j/duilib-tutorial
相关文章推荐
- DirectUI界面编程(二)绘制一个按钮
- DirectUI界面编程(二)绘制一个按钮
- String StringBuilder 和StringBuffer StringTokenizer的区别
- DuiLib : 做一个没有任务栏图标的Dialog
- PyQt 分离UI主线程与工作线程
- ValueError: bad transparency mask
- ValueError: bad transparency mask 分类: 小技巧 软件插件学习 2015-07-18 19:42 27人阅读 评论(0) 收藏
- 关于UITableView的性能优化(历上最全面的优化分析)
- POJ 2524 Ubiquitous Religions
- DP Codeforces Round #FF (Div. 1) A. DZY Loves Sequences
- zoj 1926 Guessing Game
- zoj 1926 Guessing Game
- iOS—— build 与version,InfoDictionary version的区别
- hdu 1711 Number Sequence(kmp)
- hdu 1711 Number Sequence(kmp)
- UI_cell 注册问题
- Android开发之应用程序窗体显示状态操作(requestWindowFeature()的应用)
- Android开发UI之android:gravity / android:layout_Gravity,android:padding / android:layout_margin属性区分
- mysql客户端乱码问题解决,uuid使用方法
- UI基础:UITableView的编辑和移动