你的位置:首页 > 操作系统

[操作系统]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);

image_thumb1

【2】显示多级动态普通菜单

char szMenu[] = "第一组|选项1=1\n"    "第一组|选项2=2\n"    "~\n"    "第二组|选项3=3\n"    ;  int index = auto_dynamenu::dynamenu(GetSafeHwnd(), 0, szMenu, 0, 0);

image_thumb2

【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);

image_thumb3

【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);

image_thumb4

【5】通过菜单选择整数值

        自动在选定的整数选项前加选中标记,菜单项中仅有一项相等的数值的选中。

char szMenu[] =     "整数1=1\n"    "整数20=20\n"    "整数32=32\n"    "整数0x99=0x99\n"    ;    val = (DWORD)auto_dynamenu::dynamenu(GetSafeHwnd(), 0, szMenu, 1, val);

image

【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);

image_thumb7

【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;
}

image_thumb8

【8】可以自动确定显示菜单的位置

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

image

image

image

image

待续

       后续还要发表:《WIN 下的超级动态菜单(二)用法》,《WIN 下的超级动态菜单(三)代码》。

       可以在下面的链接下载代码和示例程序:

        http://files.cnblogs.com/files/tomview/dynamenu_20160524.rar