WIN 下的超动态菜单(一)
WIN 下的超动态菜单(一)介绍
作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/
WINDOWS 编程中,通常弹出菜单的方法是在资源文件中建立菜单资源,然后在程序中装载资源显示菜单;另外可以用动态创建菜单的方法,但是逐次调用创建菜单添加菜单项的函数很麻烦。本文给出一个封装的自动创建动态菜单的类。
此类 auto_dynamenu 中只有一个静态函数 dynamenu,封装到类中的原因是这样可以把函数体放在头文件里面,使用的时候,直接包含头文件就可以了,不需要在工程内部添加实现文件,使用方便,这也是这个类叫做 auto_… 的原因。
叫超动态菜单的原因是各种菜单都可以非常容易地通过按照格式写简单的字符串来实现,不需要创建菜单资源,不需要再手工调用WIN32菜单函数,非常方便创建各种复杂的菜单。在代码中随时随地,通过写一个菜单的字符串就可以再通过一个函数调用显示菜单,获取菜单的选择。
先举几个例子:
【1】显示普通动态菜单:
char szMenu[] = "选项1=1\n"
"选项2=2\n"
"~\n"
"选项3=3\n"
; int index = auto_dynamenu::dynamenu(GetSafeHwnd(), 0, szMenu, 0, 0);

【2】显示多级动态普通菜单
char szMenu[] = "第一组|选项1=1\n"
"第一组|选项2=2\n"
"~\n"
"第二组|选项3=3\n"
; int index = auto_dynamenu::dynamenu(GetSafeHwnd(), 0, szMenu, 0, 0);

【3】显示有标记的菜单
char szMenu[] =
"第一组|^选项1=1\n"
"第一组|选项2=2\n"
"第一组|~\n"
"第一组|*选项3=3\n"
"第一组|选项4=4\n"
"~\n"
"第二组|#禁用的菜单=5\n"
"~\n"
"#禁用的菜单(灰色)=6\n"
;
int index = auto_dynamenu::dynamenu(GetSafeHwnd(), 0, szMenu, 0, 0);

【4】通过动态菜单设置标记位
自动在该位标记为1的选项上显示选中标记,菜单中可以有多个项有选中标记。
char szMenu[] =
"标记1=1\n"
"标记2=2\n"
"标记3=4\n"
"标记4=8\n"
"标记5=0x10\n"
"标记6=0x20\n"
"标记7=0x40\n"
"标记8=0x80\n"
;
flags = (DWORD)auto_dynamenu::dynamenu(GetSafeHwnd(), 0, szMenu, 2, flags);

【5】通过菜单选择整数值
自动在选定的整数选项前加选中标记,菜单项中仅有一项相等的数值的选中。
char szMenu[] =
"整数1=1\n"
"整数20=20\n"
"整数32=32\n"
"整数0x99=0x99\n"
; val = auto_dynamenu::dynamenu(GetSafeHwnd(), 0, szMenu, 1, val);

【6】根据程序数据生成动态的菜单字符串
手动管理每个菜单选项前面的选中标记。
char szMenu[1024] = {0};
int n = 0;
if (value == 2)
n += sprintf(szMenu + n, "^");
n += sprintf(szMenu + n, "值2=2\n");
if (value == 4)
n += sprintf(szMenu + n, "^");
n += sprintf(szMenu + n, "值4=4\n");
value = auto_dynamenu::dynamenu(GetSafeHwnd(), 0, szMenu, 0, 0);

【7】返回字符串的菜单
char szMenu[] =
"字符串1=字符串值1\n" //选这个选项,返回等号后字符串“字符串值1”
"字符串2\n" //这个选项没有等号,选这个选项,返回菜单字符串“字符串2”
; int index = auto_dynamenu::dynamenu(GetSafeHwnd(), 0, szMenu, 0, 0);
if (index != 0)
{
char* string = (char*)index;
}

【8】可以自动确定显示菜单的位置
可以指定显示菜单的坐标位置,也可以自动根据鼠标的当前位置的控件类型自动确定显示的菜单位置。譬如,自动显示在按钮的下方,显示在工具栏按钮的下方,显示在列表当前项的下方等,如下图所示:




下载
可以在下面的链接下载代码和示例程序:
http://files.cnblogs.com/files/tomview/dynamenu_20160524.rar
WIN 下的超动态菜单(一)的更多相关文章
- WIN 下的超动态菜单(三)代码
WIN 下的超动态菜单(一)简介 WIN 下的超动态菜单(二)用法 WIN 下的超动态菜单(三)代码 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/ 超动态 ...
- WIN 下的超动态菜单(二)用法
WIN 下的超动态菜单(一)简介 WIN 下的超动态菜单(二)用法 WIN 下的超动态菜单(三)代码 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/ ...
- Win下必备利器之Cmder
诚言,对于开发码字者,Mac和Linux果断要比Windows更贴心;但只要折腾下,Windows下也是有不少利器的.之前就有在Windows下效率必备软件一文中对此做了下记载:其虽没oh-my-zs ...
- 实战android菜单项之XML加载菜单与动态菜单项[转]
原文地址:http://blog.csdn.net/kaiwii/article/details/7767225 自定义android应用程序的菜单项首先要知道切入点.经过学习,知道主要是两个Acti ...
- [vim]vim 在win下乱码解决
vim在win下遇到汉字乱码早就知晓,本以为通过如下设置即可解决乱码问题 set encoding=utf-8 set fileencoding=utf-8,chinese 这样设置是可以解决源码文件 ...
- JS打字效果的动态菜单代码分享
这篇文章主要介绍了JS打字效果的动态菜单,推荐给大家,有需要的小伙伴可以参考下. 这是一款基于javascript实现的打字效果的动态菜单特效代码,分享给大家学习学习. 小提示:浏览器中如果不能正常运 ...
- win下 git gui 使用教程
现在很多都有git来托管项目或者来查找资料,但是看起来操作不是很方便,现在由于win下可以直接使用git gui,让使用git变得方便,当然这只是针对日常简单的使用,如果想详细的使用,可以去参考廖学峰 ...
- 两款【linux字符界面下】显示【菜单】,【选项】的powershell脚本模块介绍
两款[linux字符界面下]显示[菜单],[选项]的powershell脚本模块介绍 powershell linux ps1 menu choice Multiselect 传教士 菜单 powe ...
- 【vue】iView-admin2.0动态菜单路由
vue项目实现动态路由有俩种方式 一.前端在routers中写好--所有--路由表 <前端控制路由>,登录时根据用户的角色权限来动态的显示菜单路由 二.前端通过调用接口请求拿到当前用户-- ...
随机推荐
- No.016:3Sum Closest
问题: Given an array S of n integers, find three integers in S such that the sum is closest to a given ...
- Java经典实例:实现一个简单堆栈
堆栈(Stack)是一种常见的数据结构,符合后进先出(First In Last Out)原则,通常用于实现对象存放顺序的逆序.栈的基本操作有push(添加到堆栈),pop(从堆栈删除),peek(检 ...
- Comparable与Comparator的区别
Java的Comparator和Comparable当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 一.Com ...
- ZeroClipboard 复制到剪贴板
使用 ZeroClipboard 可以简单的将内容复制到剪贴板,通过 Adobe Flash 和 JavaScript 来实现.“Zero” 意义为这个类库没有界面,界面需要由你来建立. 版本: Ze ...
- Vanilla Masker – 功能强大的输入过滤插件
Vanilla Masker 是一个纯 JavaScript 实现的输入内容过滤和自动转换插件.现在你可以使用一个简单而纯粹的 JavaScript 库来控制你的 input 元素,而不需要加载 jQ ...
- 【CSS3】 理解CSS3 transform中的Matrix(矩阵)
理解CSS3 transform中的Matrix(矩阵) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu ...
- [js开源组件开发]数字或金额千分位格式化组件
数字或金额千分位格式化组件 这次距离上一个组件<[js开源组件开发]table表格组件>时隔了一个月,由于最近的项目比较坑,刚挖完坑,所以来总结性提出来几个组件弥补这次的空缺,首先是金额和 ...
- 【web前端面试题整理07】我不理解表现与数据分离。。。
拜师传说 今天老夫拜师了,老夫有幸认识一个JS高手,在此推荐其博客,悄悄告诉你,我拜他为师了,他承诺我只收我一个男弟子..... 师尊刚注册的账号,现在博客数量还不多,但是后面点会有干货哦,值得期待. ...
- 如何使用代码或脚本启用SharePoint的备用语言
SP的多语言,需要安装语言包,然后手工去sharepoint下启动备用语言,如下图: [网站操作]-[语言设置]: 方法一:采用powershell处理 在很多项目情况下,需要用代码进行备用语言启动. ...
- Python 操作 MySQL 之 pysql 与 ORM(转载)
本文针对 Python 操作 MySQL 主要使用的两种方式讲解: 原生模块 pymsql ORM框架 SQLAchemy 本章内容: pymsql 执行 sql 增\删\改\查 语句 pymsql ...