nim_duilib(12)之menu(2)
introduction
- 更多控件用法,请参考 here 和 源码。
- 本文将介绍menu的选项注册回调
before starting
本文的代码基于上一篇
stage1
回到项目demo_xml, 继续编辑。
BasicForm.h
BasicForm 类中继续增加下面的函数
// 处理菜单弹选项点击事件
bool OnMenuItemClicked(ui::EventArgs* msg);
该函数用做处理菜单选项的点击。
BasicForm.cpp
OnSettingsBtnClicked函数
settings按钮关联的回调函数是OnSettingsBtnClicked。现在,增加后的函数体如下:
bool BasicForm::OnSettingsBtnClicked(ui::EventArgs* msg)
{
// 点击设置按钮,弹出菜单
RECT rect = msg->pSender->GetPos();
ui::CPoint point;
point.x = rect.left - 175;
point.y = rect.top + 10;
ClientToScreen(m_hWnd, &point);
nim_comp::CMenuWnd* pmenu = new(std::nothrow) nim_comp::CMenuWnd(NULL);
if (pmenu)
{
ui::STRINGorID xml(L"settings_menu.xml");
pmenu->Init(xml, _T("xml"), point);
// 菜单选项注册回调
//----------------------------------------------------------------------------------------
auto bind_func = [this](nim_comp::CMenuElementUI* pitem)
{
if (pitem)
pitem->AttachSelect(nbase::Bind(&BasicForm::OnMenuItemClicked, this, std::placeholders::_1));
};
nim_comp::CMenuElementUI* pmenu_item1 = (nim_comp::CMenuElementUI*)pmenu->FindControl(L"menu_item1");
nim_comp::CMenuElementUI* pmenu_item2 = (nim_comp::CMenuElementUI*)pmenu->FindControl(L"menu_item2");
nim_comp::CMenuElementUI* pmenu_item3 = (nim_comp::CMenuElementUI*)pmenu->FindControl(L"menu_item3");
bind_func(pmenu_item1);
bind_func(pmenu_item2);
bind_func(pmenu_item3);
}
return false;
}
其中,相对上一篇, 仅增加了下面的代码:
// 菜单选项注册回调
//----------------------------------------------------------------------------------------
auto bind_func = [this](nim_comp::CMenuElementUI* pitem)
{
if (pitem)
pitem->AttachSelect(nbase::Bind(&BasicForm::OnMenuItemClicked, this, std::placeholders::_1));
};
nim_comp::CMenuElementUI* pmenu_item1 = (nim_comp::CMenuElementUI*)pmenu->FindControl(L"menu_item1");
nim_comp::CMenuElementUI* pmenu_item2 = (nim_comp::CMenuElementUI*)pmenu->FindControl(L"menu_item2");
nim_comp::CMenuElementUI* pmenu_item3 = (nim_comp::CMenuElementUI*)pmenu->FindControl(L"menu_item3");
bind_func(pmenu_item1);
bind_func(pmenu_item2);
bind_func(pmenu_item3);
我当时这里卡了,不知道怎么给菜单的选项关联回调函数。后来观察源码demo后发现,需要为每一个菜单选项关联回调函数。就像上面的代码一样,找到每一个菜单选项,进行关联。我这里的代码,三个菜单选项都关联的是同一个回调函数。
OnMenuItemClicked函数
这个函数是处理点击菜单选项的回调函数。 其函数体如下:
bool BasicForm::OnMenuItemClicked(ui::EventArgs* msg)
{
if (msg)
{
std::wstring str = msg->pSender->GetName() + std::wstring(L"\n\n");
LPCWSTR result = str.c_str();
OutputDebugString(result);
}
return false;
}
当点击弹出的菜单选项时,将执行这个函数。这个函数将输出到VS的输出窗口中。
演示输出

nim_duilib(12)之menu(2)的更多相关文章
- nim_duilib(11)之menu(1)
introduction 更多控件用法,请参考 here 和 源码. 本文的代码基于这里 本文将介绍menu控件 xml文件添加代码 基于上一篇, 继续向basic.xml中添加下面的代码. xml完 ...
- Total Commander 8.52 Beta 1
Total Commander 8.52 Beta 1http://www.ghisler.com/852_b1.php 10.08.15 Release Total Commander 8.52 b ...
- CentOS6.4安装Smokeping节点监控软件
Smokeping:它是rrdtool的作者制作的,在图形显示方面很漂亮,可以用来很好的检测网络状态和稳定性,下面简单说一下Smokeping的安装以及配置方法. 0.首先关闭selinux和防火墙 ...
- PowerDesigner 根据NAME属性自动生成表和列注释(不用写脚本)
PowerDesigner 11 menu: [Database]->[Database Generation] tab: [Tables & Views]->check tabl ...
- 3D效果导航代码
*, *:before, *:after { padding:; margin:; box-sizing: border-box; } .menu { list-style: none; width: ...
- dictionary (key-value) (map容器)
#dictionary可以保存不同类型的值 menu = {'fish0':14.50} list = [] menu['fish1'] = 10.1 # Adding new key-value p ...
- Android slidingmenu详细解释 滑动的优化
Android slidingmenu 详细解释 性能优化 转载请注明: http://blog.csdn.net/aaawqqq 简单介绍 SlidingMenu 是github 上Androi ...
- CSS3基础(3)——CSS3 布局属性全接触
一. 弹性盒模型 1.弹性盒子模型介绍 弹性盒模型(Flexible Box或Flexbox)是一个CSS3新增布局模块,官方称为CSS Flexible Box Layout Module,用于实现 ...
- 自动化安装smokeping-2.6.11脚本
自动化安装Smokeping-2.6.11脚本 一.目的 1.1 监控目的 为方便监测各数据中心网络状况,自定义全国各节点,从而发现网络异常,判断网络故障. 1.2 本文目的 快速部署Smokepin ...
随机推荐
- CF840D Destiny
题目传送门. 题意简述:多次询问求出一个区间最小的出现次数严格大于 \(\frac{r-l+1}{k}\ (2\leq k\leq 5)\) 的最小的数.无解输出 \(-1\). 注意到这个 \(k\ ...
- 有关[Http持久连接]的一切,撕碎给你看
上文中我的结论是: HTTP Keep-Alive 是在应用层对TCP连接进行滑动续约复用, 如果客户端/服务器稳定续约,就成了名副其实的长连接. 目前所有的Http网络库都默认开启了HTTP Kee ...
- 变量、内存区域、MDK文件(map、htm)
变量分为:局部变量和全局变量 局部变量:函数体内部定义的变量,作用域为函数内部,static声明(静态局部变量)该变量则函数调用结束后不消失而保留值,分配的存储空间不释放. 全局变量:函数体外部定义的 ...
- 生产调优2 HDFS-集群压测
目录 2 HDFS-集群压测 2.1 测试HDFS写性能 测试1 限制网络 1 向HDFS集群写10个128M的文件 测试结果分析 测试2 不限制网络 1 向HDFS集群写10个128M的文件 2 测 ...
- Yarn 公平调度器案例
目录 公平调度器案例 需求 配置多队列的公平调度器 1 修改yarn-site.xml文件,加入以下从参数 2 配置fair-scheduler.xml 3 分发配置文件重启yarn 4 测试提交任务 ...
- MapReduce06 MapReduce工作机制
目录 5 MapReduce工作机制(重点) 5.1 MapTask工作机制 5.2 ReduceTask工作机制 5.3 ReduceTask并行度决定机制 手动设置ReduceTask数量 测试R ...
- Celery进阶
Celery进阶 在你的应用中使用Celery 我们的项目 proj/__init__.py /celery.py /tasks.py 1 # celery.py 2 from celery ...
- 淘宝、网易移动端 px 转换 rem 原理,Vue-cli 实现 px 转换 rem
在过去的一段时间里面一直在使用Vue配合 lib-flexible和px2rem-loader配合做移动端的网页适配.秉着求知的思想,今天决定对他的原理进行分析.目前网上比较主流使用的就是淘宝方 ...
- 时光网内地影视票房Top100爬取
为了和艺恩网的数据作比较,让结果更精确,在昨天又写了一个时光网信息的爬取,这次的难度比艺恩网的大不少,话不多说,先放代码 # -*- coding:utf-8 -*-from __future__ i ...
- Java——数组的定义与使用
数组的定义与使用 1.数组的基本概念 (1)数组的动态初始化: 数组首先先开辟内存空间,而后再使用索引进行内容的设置,这种定义数组的方式称为动态初始化 数组是引用数据类型,存在有内存分配问题.在使用前 ...