上节介绍了使用源码方式构建Duilib应用的项目配置,并创建了一个最简单的基于Duilib库的窗口,细心的读者会发现,当我们点击窗口的关闭按钮时,应用并没有真的退出,因为我们并没有对窗口事件进行处理,本节我们在窗口中绘制一个按钮并响应窗口及按钮的相关事件。

在窗口中绘制一个按钮我们需要以下几个步骤:

  1. 创建并初始化CPaintManagerUI对象,CPaintManagerUI类是Duilib库的绘图管理器,用于管理整个窗口的绘制。
  2. 创建CButtonUI对象,并调用CPaintManagerUI对象的AttachDialog函数将CButtonUI对象附加到CPaintManagerUI对象中。
  3. 调用CPaintManagerUI对象的AddNotifier为按钮指定消息处理类。
  4. 在WM_PAINT消息处理中调用CButtonUI对象的SetPos函数设置按钮的位置和大小。

案例代码如下:

  1. #include <Windows.h>
  2. #include "../DuiLib/StdAfx.h"
  3. using namespace DuiLib;
  4. class CMyWnd : public CWindowWnd,public INotifyUI
  5. {
  6. public:
  7. CMyWnd(){}
  8. LPCTSTR GetWindowClassName() const
  9. {
  10. return L"MyWnd";
  11. }
  12. UINT GetClassStyle() const{
  13. return UI_CLASSSTYLE_FRAME|CS_DBLCLKS;
  14. }
  15. void Notify(TNotifyUI& msg)
  16. {
  17. //判断是否为点击事件
  18. if(msg.sType == L"click")
  19. {
  20. //判断事件源名称是否为CloseBtn
  21. if(msg.pSender->GetName() == L"CloseBtn")
  22. {
  23. if(IDOK == ::MessageBox(NULL,L"退出程序?",L"提示信息",MB_OKCANCEL))
  24. {
  25. ::PostQuitMessage(0);
  26. }
  27. }
  28. }
  29. }
  30. LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  31. {
  32. switch(uMsg)
  33. {
  34. case WM_CREATE:
  35. {
  36. m_PaintMgr.Init(m_hWnd);
  37. //创建按钮
  38. m_pCloseBtn = new CButtonUI();
  39. m_pCloseBtn->SetName(L"CloseBtn");
  40. m_pCloseBtn->SetBkColor(0xFFFF0000);
  41. m_pCloseBtn->SetText(L"关闭按钮");
  42. m_pCloseBtn->SetVisible(true);
  43. m_PaintMgr.AttachDialog(m_pCloseBtn);
  44. m_PaintMgr.AddNotifier(this);
  45. }
  46. break;
  47. case WM_PAINT:
  48. {
  49. RECT rect = {100,100,200,150};
  50. m_pCloseBtn->SetPos(rect);
  51. }
  52. break;
  53. case WM_DESTROY:
  54. ::PostQuitMessage(0);
  55. break;
  56. }
  57. LRESULT lRes=0;
  58. if(m_PaintMgr.MessageHandler(uMsg,wParam,lParam,lRes)) return lRes;
  59. return CWindowWnd::HandleMessage(uMsg,wParam,lParam);
  60. }
  61. ~CMyWnd(){}
  62. private:
  63. CPaintManagerUI m_PaintMgr;
  64. CControlUI* m_pCloseBtn;
  65. };
  66. INT WinMain(HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpCmdLine,INT Show)
  67. {
  68. CPaintManagerUI::SetInstance(hInst);
  69. //创建主窗口
  70. CMyWnd* pFrame = new CMyWnd();
  71. pFrame->Create(NULL,L"Hello World!",UI_WNDSTYLE_FRAME,WS_EX_WINDOWEDGE);
  72. pFrame->CenterWindow();
  73. //设置窗口大小
  74. pFrame->ResizeClient(800,600);
  75. pFrame->ShowWindow(true);
  76. CPaintManagerUI::MessageLoop();
  77. delete pFrame;
  78. return 0;
  79. }

在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界面编程(二)绘制一个按钮的更多相关文章

  1. DirectUI界面编程(四)界面布局详解

    Duilib的界面布局使用xml文件进行描述,在Duilib v1.1版本的xml布局文件中我们可以使用以下这些标签(后续版本标签有扩充): 这些标签总的来讲可以分为三类: 窗口类,该类别中只有一个W ...

  2. DirectUI界面编程(三)从XML文件中加载界面

    Duilib支持xml界面布局,使得界面设计与逻辑处理相分离,本节介绍如何从xml文件中加载界面元素. 我们需要以下几个步骤: 创建并初始化CPaintManagerUI对象. 创建CDialogBu ...

  3. DirectUI界面编程(一)创建第一个应用

    1.获取Duilib库文件 通过上一节大家对DirectUI界面设计有了初步的了解,本节开始我们一起学习Duilib界面库的使用. 首先我们需要获取Duilib库,目前最新版本为2.0,最新版本源码托 ...

  4. DirectUI界面编程(零)简介

    有过Win32.MFC编程经验的朋友应该都知道,传统Windows应用中的按钮.编辑框等控件都是一个子窗口,操作系统通过窗口句柄来唯一标识该窗口. 使用Windows 标准控件创建用户界面,美化起来是 ...

  5. DirectUI界面编程(六)实现右键弹出菜单

    本节向大家介绍一下右键弹出菜单是如何实现的.效果如下,在窗口中点击鼠标右键弹出菜单,点击菜单项能够响应菜单点击事件. 使用Duilib库实现的弹出菜单,实际上也是一个Windows窗口,因此我们需要创 ...

  6. DirectUI界面编程(五)WindowImplBase的使用

    上节笔者向大家介绍了Duilib的界面布局并在最后编写了一个仿QQ旋风的界面,但是由于我们屏蔽了系统的标题栏,读者可能已经发现,我们的窗口没办法移动,同样也不能通过拖动来改变窗口的大小. 这就需要我们 ...

  7. java之 22天 GUI 图形界面编程(二)

    转自:http://takeme.iteye.com/blog/1876853 模拟window开打文件 import java.awt.Button; import java.awt.Dialog; ...

  8. 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(中)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 四.创建一个Blazor应用程序 1. 第一种创 ...

  9. Java界面编程-建立一个可以画出图形的简单框架

    引子:总共使用3个.java文件,建立一个简单界面编程的框架. 第1个文件:NotHelloWorldComponent.java //NotHelloWorldComponent.java 1 im ...

随机推荐

  1. Qwt--散点图/函数图

    1.Qwt库 QwtPlot是用来绘制二维图像的widget.在它的画板上可以无限制的显示绘画组件.绘画组件可以是曲线(QwtPlotCurve).标记(QwtPlotMarker).网格(QwtPl ...

  2. Kafka学习笔记(4)----Kafka的Leader Election

    1. Zookeeper的基本操作 zookeeper中的节点可以持久化/有序的两个维度分为四种类型: PERSIST:持久化无序(保存在磁盘中) PERSIST_SEQUENTIAL:持久化有序递增 ...

  3. 超实用的JavaScript代码段

    1. 判断日期是否有效 JavaScript中自带的日期函数还是太过简单,很难满足真实项目中对不同日期格式进行解析和判断的需要.JQuery也有一些第三方库来使日期相关的处理变得简单,但有时你可能只需 ...

  4. 05 Django与Ajax

      一.Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互, ...

  5. nyoj48-小明的调查作业

    48-小明的调查作业 内存限制:64MB时间限制:1000msSpecial Judge: No accepted:3submit:4 题目描述: 小明的老师布置了一份调查作业,小明想在学校中请一些同 ...

  6. docker 私有仓库的两种方式

    1.使用官方默认的registry镜像构建本地仓库 这种方式适用于小规模的镜像仓库储存,没有Ui界面 (1)docker pull registry (2)docker run -d -p 5000: ...

  7. Yii2.0 RESTful API 认证教程

    认证介绍 和Web应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权状态可能没通过 sess ...

  8. 《黑白团团队》第八次团队作业:Alpha冲刺 第二天

    项目 内容 作业课程地址 任课教师首页链接 作业要求 团队项目 填写团队名称 黑白团团队 填写具体目标 认真负责,完成项目 团队项目Github仓库地址链接. 第二天 日期:2019/6/16 成员 ...

  9. PHP学习总结(2)——PHP入门篇之PHP代码标识

    认识PHP代码标识 想在页面中编写PHP​代码非常容易,如下面代码: <?php echo "想学习php吗?来慕课网吧";?> 就像你可以编写JavaScript脚本 ...

  10. Tsinsen A1206. 小Z的袜子

    /* Tsinsen A1206. 小Z的袜子 http://www.tsinsen.com/new/A1206 BZOJ 2038: [2009国家集训队]小Z的袜子(hose) http://ww ...