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

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

  1. 创建并初始化CPaintManagerUI对象,CPaintManagerUI类是Duilib库的绘图管理器,用于管理整个窗口的绘制。
  2. 创建CButtonUI对象,并调用CPaintManagerUI对象的AttachDialog函数将CButtonUI对象附加到CPaintManagerUI对象中。
  3. 调用CPaintManagerUI对象的AddNotifier为按钮指定消息处理类。
  4. 在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界面编程(二)绘制一个按钮的更多相关文章

  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. 关于layui 三级联动 渲染报错解决方法

    /** * 时间:2016年11月27日 * 作者:707200833 * 说明:依赖与jQuery和layui, 是基于layui开发的一个省市区联动的小插件, 使用上要基于layui的表单进行使用 ...

  2. js代码 注释 test

    <script type="text/javascript"> var obj = { tyep: 'GET', url: '/Backstage/Home/Menu' ...

  3. JavaScript数组操作函数

    A: 购物车会有这样的情况,购物车是一个数组,每一个商品是一个对象,分别对应一个id,和一个num ,然后改变商品的时候需要和购物车对比,如果购物车中有这个商品的话,就只改变这个商品对应的id的num ...

  4. codeforce 788 A. Funtions again

    链接 A. Functions again 题意 这是一道求最大连续子序列和变形题. 做法 先将abs(a[i+1]-a[i]算出来,然后用两个数组dp[i],cp[i],dp维护其最大值,cp维护其 ...

  5. jmeter目录讲解

    1.jmeter目录详解 2.这是bin目录下的examples 3.这是bin目录下的report-template 注意啦:jmeterw.cmd运行不带命令的窗口会侵占8080端口,会和tomc ...

  6. 【UOJ139】【UER #4】被删除的黑白树

    题意: 很久很久以前,有一棵树加入了 UOJ 群. 这天,在它讨论“一棵树应该怎么旋转”的时候一不小心被删除了,变成了被删除的树. 突然间,它突然发现它失去了颜色,变成了一棵纯白的树.这让它感觉很焦躁 ...

  7. GROUP BY GROUPING SETS 示例

    --建表 create table TEst1 ( ID ), co_CODE ), T_NAME ), Money INTEGER, P_code ) ); --插入基础数据 insert into ...

  8. 【JavaScript框架封装】JavaScript中的文本字符串的转义和反转义的实现

    如果是想把本地的一个字符串串存到服务器,再次取出来的还是文本的话,就需要这个文本字符串的转义: /** * 对一个字符串的转义 * @param str * @return {*} */ functi ...

  9. Project Euler 2 Even Fibonacci numbers

    题意:斐波那契数列中的每一项都是前两项的和.由1和2开始生成的斐波那契数列前10项为:1, 2, 3, 5, 8, 13, 21, 34, 55, 89, -考虑该斐波那契数列中不超过四百万的项,求其 ...

  10. [luogu2216 HAOI2007] 理想的正方形 (2dST表 or 单调队列)

    题目描述 有一个ab的整数组成的矩阵,现请你从中找出一个nn的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至第a ...