introduction

  • 更多控件用法,请参考 here 和 源码。
  • 本文的代码基于这里

lets go

xml文件添加代码

下面的xml文件内容,删除label控件的相关代码,增加了3个按钮。 其中,代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Window size="600,400" caption="0,0,0,35">
  3. <VBox bkcolor="bk_wnd_darkcolor">
  4. <HBox width="stretch" height="35" bkcolor="bk_wnd_lightcolor">
  5. <Control />
  6. <Button class="btn_wnd_min" name="minbtn" margin="4,6,0,0" />
  7. <Box width="21" margin="4,6,0,0">
  8. <Button class="btn_wnd_max" name="maxbtn"/>
  9. <Button class="btn_wnd_restore" name="restorebtn" visible="false"/>
  10. </Box>
  11. <Button class="btn_wnd_close" name="closebtn" margin="4,6,8,0"/>
  12. </HBox>
  13. <!--下面是中间的控件-->
  14. <VBox padding="30, 30, 30, 30" >
  15. <HBox>
  16. <VBox>
  17. <!-- Buttons -->
  18. <Button class="btn_global_blue_80x30" name="btn_blue" text="blue" />
  19. <Button class="btn_global_white_80x30" name="btn_white" text="white"/>
  20. <Button class="btn_global_red_80x30" name="btn_red" text="red"/>
  21. </VBox>
  22. </HBox>
  23. </VBox> <!--下面是中间的控件 结束-->
  24. </VBox>
  25. </Window>

其中新增的代码用注释括起来了。

解释

上述的xml代码中,整体是垂直布局,其中,窗体中间是用的是垂直布局,为了继续增加控件,又套了一个水平布局,按钮使用的是垂直布局。 class属性需要到global.xml文件中查看。

回到VS项目中

打开 BasicForm.h, 类中新增下面的代码, 用于与上面的按钮关联。

  1. private:
  2. // 定义了3个buttons
  3. ui::Button *pbtn_arr_[3];

同时增加一个函数,用于处理按钮点击事件

  1. private:
  2. //
  3. // @ brief: 按钮点击事件
  4. // @ str_name - 显示内容
  5. // @ return - void
  6. void OnCenterBtnClicked(const std::wstring &&str_name);

打开BasicForm.cpp, 新增下面的代码到InitWindow函数中。

  1. //
  2. // @brief:
  3. //
  4. void BasicForm::InitWindow()
  5. {
  6. // 查找界面的按钮
  7. pbtn_arr_[0] = dynamic_cast<ui::Button*>(FindControl(L"btn_blue"));
  8. pbtn_arr_[1] = dynamic_cast<ui::Button*>(FindControl(L"btn_white"));
  9. pbtn_arr_[2] = dynamic_cast<ui::Button*>(FindControl(L"btn_demo"));
  10. // 方法1: 绑定按钮点击事件
  11. if (pbtn_arr_[0])
  12. pbtn_arr_[0]->AttachClick(nbase::Bind(&BasicForm::OnBtnClicked, this, std::placeholders::_1));
  13. // 方法1: 为按钮绑定触发点击的事件
  14. for (unsigned int index = 1; index < 3; ++index)
  15. {
  16. if (pbtn_arr_[index])
  17. {
  18. pbtn_arr_[index]->AttachClick([this](ui::EventArgs* args)
  19. {
  20. OnCenterBtnClicked(args->pSender->GetName() + std::wstring(L"\n"));
  21. return true;
  22. });
  23. }
  24. }
  25. }

其中,btn_blue为xml中的name属性。使用lambda表达式,调用函数上面新增的函数OnCenterBtnClicked。而OnCenterBtnClicked的函数体如下:

  1. //
  2. // @brief:
  3. //
  4. void BasicForm::OnCenterBtnClicked(const std::wstring &&str_name)
  5. {
  6. LPCWSTR result = str_name.c_str();
  7. OutputDebugString(result);
  8. }

点击按钮

运行调试,点击按钮,VS2017的输出窗口中将输出点击按钮的名字。例如:

至此,我们已经能够点击按钮并处理按钮的点击。

其他

  • 按钮控件Button有AttachMouseEnter、AttachButtonDown、AttachClick方法,他们分别用于指定控件鼠标进入、鼠标按下、鼠标单击的事件处理函数。这些函数的具体用法,可以参考官方给出的例子。
  • EventArgs结构体中包含了触发事件的控件的指针、鼠标坐标、按键状态、时间戳等信息。函数的返回值,返回true表示继续传递控件消息,返回false表示停止传递控件消息。

nim_duilib(3)之按钮的更多相关文章

  1. nim_duilib(20)之即刻(1)

    note 一个基于nim_duilib仿wechat的IM. 主界面 样式 美工差了. 布局 整体为水平布局,左边的深灰色区域(frame_left),右侧的light white区域(frame_r ...

  2. nim_duilib(14)之xml配置半透明窗体控件不透明

    before starting note 截至目前,我只能用xml写一些简单的布局和设置控件属性,循序渐进吧. 正在学习nim_duilib的xml的一些属性. xml配置半透明 GTAV中就有很多控 ...

  3. nim_duilib(13)之添加fmt库

    introduction 习惯使用fmt库做字符串的格式化操作.尽管nim_duilib提供了类似的函数. 故项目demo_xml引入了外部库fmt framework.h中添加下面的以便使用fmt库 ...

  4. nim_duilib(2)之xml目录结构理解

    introduction 本文将总结我对nim_duilib的xml配置. 更多控件和控件属性的具体说明, 请参考 here before starting 1 You should clone th ...

  5. nim_duilib(1)之第一个dui executable(including configure setting in vs2017)

    before starting clone nim_duilib: https://github.com/netease-im/NIM_Duilib_Framework 迁出github的源码即可. ...

  6. ExtJS 4.2 Date组件扩展:添加清除按钮

    ExtJS中除了提供丰富的组件外,我们还可以扩展他的组件. 在这里,我们将在Date日期组件上添加一个[清除]按钮,用于此组件已选中值的清除. 目录 1. Date组件介绍 2. 主要代码说明 3. ...

  7. 关于Android避免按钮重复点击事件

    最近测试人员测试我们的APP的时候,喜欢快速点击某个按钮,出现一个页面出现多次,测试人员能不能禁止这样.我自己点击了几下,确实存在这个问题,也感觉用户体验不太好.于是乎后来我搜了下加一个方法放在我们U ...

  8. Expression Blend创建自定义按钮

    在 Expression Blend 中,我们可以在美工板上绘制形状.路径和控件,然后修改其外观和行为,从而直观地设计应用程序.Button按钮也是Expression Blend最常用的控件之一,在 ...

  9. 步入angularjs directive(指令)--点击按钮加入loading状态

    今天我终于鼓起勇气写自己的博客了,激动与害怕并存,希望大家能多多批评指导,如果能够帮助大家,也希望大家点个赞!! 用angularjs 工作也有段时间了,总体感觉最有挑战性的还是指令,因为没有指令的a ...

随机推荐

  1. bitset 的妙用:乱搞字符串匹配

    最近碰到了几次 bitset 乱搞字符串匹配的情况,故写文以记之. 1. 算法简介 核心思想:假设文本串为 \(s\),则对字符集中的每一个字符 \(c\) 开一个大小为 \(|s|\) 的 bits ...

  2. clickhouse使用的一点总结

    clickhouse据说是用在大数据量的olap场景列式存储数据库,也有幸能够用到它在实际场景中落地.本篇就来说说简单的使用心得吧. 1. 整体说明 架构啥的,就不多说了,列式存储.大数据量.高性能. ...

  3. TCP三次握手与Linux的TCP内核参数优化

    感谢各位技术大佬的资料分享,这里我把我理解的内容做一个整理 一:TCP的三次握手 1.TCP简述 TCP是一个面向连接的协议,在连接双方发送数据之前,首先需要建立一条连接.TCP建立连接可以简单称为: ...

  4. 一个好用的快速安装lnmp环境包lnmp1-6

    一个好用的快速安装lnmp环境包lnmp1-6 地址:https://lnmp.org/tag/lnmp1-6/

  5. PDFium 渲染

    PDFium 是 Chromium 的 PDF 渲染引擎,许可协议为 BSD 3-Clause.不同于 Mozilla 基于 HTML5 的 PDF.js,PDFium 是基于 Foxit Softw ...

  6. Volatile的3大特性

    Volatile volatile是Java虚拟机提供的轻量级的同步机制 3大特性 1.保证可见性 当多个线程同时访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值 案例代码 ...

  7. 入坑不亏!我们最终决定将 70w+ 核心代码全部开源

    作者 | 一啸 来源 | 尔达 Erda 公众号 背景故事 2017 年初,我们基于 DC/OS (mesos + marathon) 开始构建端点自己的 PaaS 平台,核心任务就是解决公司的软件开 ...

  8. 百度 IP 查询

    查询 IP 地址以及百度爬虫 IP 我们如果要查询 IP 地址,互联网上有很多提供IP查询服务的网站,我这里总结和归纳如下: 国内提供 IP 查询的网站: IP138 IPIP,提供 IP 详细信息, ...

  9. python web框架学习笔记

    一.web框架本质 1.基于socket,自己处理请求 #!/usr/bin/env python3 #coding:utf8 import socket def handle_request(cli ...

  10. Nginx 1.9.7.2 + PHP 5.6.18(FastCGI)在CentOS Linux下的编译安装

    本文参考张宴的Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)[原创]完成.所有操作命令都在CentOS 6.x 64位操作系统下实践 ...