搜索
查看: 15278|回复: 19

[win] 给菜单添加图标[已更新]

    [复制链接]

12

主题

624

帖子

3649

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
3649
发表于 2012-2-20 01:08:47 | 显示全部楼层 |阅读模式
Api函数 SetMenuItemBitmaps声明如下:
SetMenuItemBitmaps = ::User32.api("SetMenuItemBitmaps","bool(pointer menu,int position,int flags,pointer hBmp,pointer hBmpChecked)")

说明
设置一幅特定位图,令其在指定的菜单条目中使用,代替标准的复选符号(√)。

我们首先在menu基类menubase名字空间下添加api声明如下:

namespace menubase{
      SetMenuItemBitmaps = ::User32.api(
"SetMenuItemBitmaps","bool(pointer menu,int position,int flags,pointer hBmp,pointer hBmpChecked)")
}

然后在menubase 类下声明一个函数:
    setBitmap = function(position,bitmap,bmpUnchecked,flag=0x400/*_MF_BYPOSITION*/){
        
if( type(bitmap) == "string") {
            
var img = ..com.picture.load(bitmap);//转化为句柄
            bitmap = img.CopyHandle();
        }
        
if( type(bitmapCheckd) == "string") {
            
var img = ..com.picture.load(bitmapCheckd);//转化为句柄
            bitmapCheckd = img.CopyHandle();
        }
        
        
return SetMenuItemBitmaps(this.handle,this.getId(position,flag),0x111/*_WM_COMMAND*/,bitmap,bitmapCheckd);
    };


使用示例:

import win.ui.menu;
var menuFile = win.ui.popmenu(winform);//创建弹出菜单

menuFile.add(
"新建",
   
function(id){
        winform.msgbox(
"新建")
    }
)
var menu = win.ui.menu(winform);//创建主菜单
menu.add('文件',menuFile)

menuFile.setBitmap(0,
"\res\ico\new.bmp") //这样就OK了 - -

如下图:
snap022.jpg

可是这样还有一个问题就是只能创建完后才可以设置图标,有什么办法能让我们在菜单创建之初就同时设置图标呢?下面我们来看下菜单的add()函数是如何实现的,
代码如下:

    add = function(lable,proc,mflag=0,id){
               
        
if(!lable && (!proc) ){
            AppendMenu(
this.handle,0x800/*_MF_SEPARATOR*/, 0,null );
            
return;
        }
        
        
if( type(proc)==type.table ){
        
            
if( ! proc[["handle"]] ){
                proc = ..win.ui.popmenu(
this.parent ).addTable( proc ,2 )  
            }  
            AppendMenu(
this.handle,0x10/*_MF_POPUP*/,tonumber(proc.handle),lable );
            
return proc;
        }
        
else{
            
if(!id)
                id =
this.parent._getFreeCommandId();
            
            
if(proc){
               
if( type(proc)!=type.function) {
                    
error("参数二必须是一个回调函数",2  );
                }
                    
               
this.parent._mapCommandProc[id] = proc;
            }
            
            AppendMenu(
this.handle,0/*_MF_STRING*/ | mflag,id ,lable );

            
return id;
        }      
    }
从上面的代码我们可以看到add()函数 都是依靠api函数 AppendMenu来完成的。
参考api手册,我们知道add() 函数根据参数的不同分为三个部分来实现的:
1、参数table和proc均为空:
根据菜单常量标志表,我们可以知道常量0x800/*_MF_SEPARATOR*/ 的作用是在指定的条目处显示一条分隔线。
2、参数proctable类型:
这个作用是添加子菜单的,示例如下:
import win.ui.menu;

var menuFile = win.ui.menu(winform);
menuFile.add(
   
"菜单",{

//参数proc为table类型,插入子菜单
    {"子菜单1";
        
function(id){
            winform.msgbox(
"我是子菜单")
        }
    };
    {
/*table和proc均为空,插入分割线*/};
    {
"子菜单2";
        
function(id){
            winform.msgbox(
"我是子菜单")
        }
    };
})
3、参数id为空且参数proc必须是一个回调函数:
我们知道这个才是新建菜单项的,创建菜单完成后返回新建菜单的id 。
所以我在add()函数参数里面添加一个刚才我们声明setBitmap函数时用到的而add()函数原来没有的参数bitmap,修改后的代码如下:

add = function(lable,proc,bitmap,mflag=0,id){
        
//前面代码省去了......         
        AppendMenu(this.handle,0/*_MF_STRING*/ | mflag,id ,lable );
        
//创建完菜单后,判断我们的参数bitmap是否赋值、如果赋值则运行我们的代码
        //这里因为是id、而不是位置所以要用_MF_BYCOMMAN/      
        
if(bitmap){
            
this.setBitmap(id,bitmap,0x0/*_MF_BYCOMMAND*/)
        }
        
return id;
}
示例代码:

var new = function(id){winform.msgbox("新建")};
var open = function(id){winform.msgbox("打开")};
var save = function(id){winform.msgbox("保存")};
var print = function(id){winform.msgbox("打印")};
var exit = function(id){winform.close()};

//注意菜单的导航键'文件(&F)'、加速键'文件\tCtrl+N' ,此文本样式只有在单引号‘ ’下才有效!

var menu = win.ui.menu(winform);
menu.addTable( {
    {
'文件(&F)';
        {
//图标文件为16*16的位图 默认背景色为#f0f0f0
            { '新建(&N)\tCtrl+N';new;"\res\ico\new.bmp"};
            {
'打开(&O)\tCtrl+O';open;"\res\ico\open.bmp"};
            {
'保存(&S)\tCtrl+S';save;"\res\ico\save.bmp"};
            {
/*分割线*/};
            {
'打印(&P)\tCtrl+P';print;"\res\ico\print.bmp"}
            {
/*分割线*/};
            {
'退出(&E)\tCtrl+E';exit;"\res\ico\close.bmp"};
        }
    };
    {
'帮助(&H)';
        {
            {
'帮助(&H)';function(id){winform.msgbox("帮助")};"\res\ico\help.bmp"};
            
            {
'主页(&P)';
               
function(id){
                    
import process;
                    process.
execute( "http://bbs.aardio.com" )
                };
               
"\res\ico\home.bmp"
            }
            {
/*__*/}
            {
'关于(&A)';
               
function(id){
                    winform.msgbox(
"菜单图标及加速键演示程序! -- xAuto","关于")
                };
               
"\res\ico\info.bmp"
            }
        }
    };
})

附右键菜单图:

snap023.jpg


后记:

这样给菜单添加图标的功能就简单的实现了,因为水平有限、还有很多不足的地方, 期待各位大大来完善! ^_^

工程源码: menu.zip (30.73 KB, 下载次数: 421)

评分

参与人数 10专家分 +200 银币 +570 收起 理由
万事发↑新一天 + 40 很给力!
wfassg + 30 神马都是浮云
游戏 + 90
nvt303 + 90 赞一个!
cjc0045 + 40 很给力!
qqmmcc + 100 + 100 谢谢
coder + 40 很给力!
imapod + 40
tjfuyongjie + 20 很给力!
look + 100 + 80 很给力!

查看全部评分

回复

使用道具 举报

12

主题

624

帖子

3649

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
3649
 楼主| 发表于 2012-2-20 01:40:06 | 显示全部楼层

终于发完了、原来用wps写的 复制的时候看格式没错,发出去才都变成纯文本了{:soso_e127:} 害的我编辑了好几次...终于可以去睡觉了、呼呼 ^_^

终于发完了、原来用wps写的 复制的时候看格式没错,发出去才都变成纯文本了{:soso_e127:}
害的我编辑了好几次...终于可以去睡觉了、呼呼 ^_^
回复

使用道具 举报

75

主题

851

帖子

4982

积分

六级会员

The only one

Rank: 9Rank: 9Rank: 9

积分
4982
发表于 2012-2-20 08:05:12 | 显示全部楼层

好久不见,LZ辛苦了~!给许多朋友带来了福音!

好久不见,LZ辛苦了~!给许多朋友带来了福音!
小时候,幸福是一件东西,拥有就是幸福; 长大了,幸福是一个目标,达到就是幸福; 成熟后,发现幸福原来是一种心态,领悟就是幸福.
回复

使用道具 举报

9

主题

65

帖子

386

积分

二级会员

Rank: 3Rank: 3

积分
386
发表于 2012-2-20 12:28:52 | 显示全部楼层

图文并茂 还有分析过程 很好 很精彩 谢谢楼主的分享

图文并茂 还有分析过程 很好 很精彩 谢谢楼主的分享
回复

使用道具 举报

9

主题

204

帖子

1301

积分

四级会员

Rank: 6Rank: 6

积分
1301
发表于 2012-2-20 15:00:02 | 显示全部楼层

期待楼 主更多分享,谢谢

期待楼 主更多分享,谢谢
回复

使用道具 举报

5

主题

64

帖子

452

积分

二级会员

Rank: 3Rank: 3

积分
452
发表于 2012-2-20 16:21:59 | 显示全部楼层

{:soso_e102:} 这东西相当有价值啊!谢谢楼主贡献!希望可以直接加入标准库就好了!!!

{:soso_e102:}  这东西相当有价值啊!谢谢楼主贡献!希望可以直接加入标准库就好了!!!
回复

使用道具 举报

4

主题

15

帖子

136

积分

荣誉会员

Rank: 8Rank: 8

积分
136
发表于 2012-2-20 16:24:30 | 显示全部楼层

厉害的作品呐~~~~!!!!

厉害的作品呐~~~~!!!!
回复

使用道具 举报

7

主题

124

帖子

752

积分

三级会员

Rank: 4

积分
752
QQ
发表于 2012-2-20 18:01:49 | 显示全部楼层

支持楼主,强人一个

支持楼主,强人一个
自己做的更适合自己
回复

使用道具 举报

143

主题

2145

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11851
发表于 2012-2-22 08:36:41 | 显示全部楼层

感谢xauto,我改动了一下添加到了标准库里,用法见代码提示。 在aardio中,除了窗口句柄以外,所有句柄约定使用指针类型,这样可以保持代码一致。

感谢xauto,我改动了一下添加到了标准库里,用法见代码提示。

在aardio中,除了窗口句柄以外,所有句柄约定使用指针类型,这样可以保持代码一致。

另外在中间插入bitmap参数不太好,这样以前的一些程序可能不兼容,因为参数位置改变了,增加功能一定要兼容之前的程序。所以我给改成了参数表的格式,这样就可以不影响以前的程序,又可以无限制的控制参数


winform.menu.add(
    text = "标题";
    bitmap =
"位图句柄或路径、或图像数据,可选参数";
    bitmapCheckd =
"选中位图句柄或路径、或图像数据,可选参数";
    proc =
function(id){
        
    };
    id = 可选参数;
    flag = 可选参数;
};

最新版本添加快捷键操作已经简化,只要一句代码就可实现



//添加加速键
import win.ui.accelerator;
var accel = win.ui.accelerator({
    { ctrl =
true; vkey = 'N'#; oncommand = new }
    { ctrl =
true; vkey = 'O'#; oncommand = open }
    { ctrl =
true; vkey = 'S'#; oncommand = save }
    { ctrl =
true; vkey = 'P'#; oncommand = print}
    { ctrl =
true; vkey = 'Q'#; oncommand = exit }  
},winform )

回复

使用道具 举报

5

主题

64

帖子

452

积分

二级会员

Rank: 3Rank: 3

积分
452
发表于 2012-2-23 23:55:20 | 显示全部楼层

{:3_46:} Jacen果然给力!不但加入了标准库还修改得更标准!从中我们也学习了!谢谢!

  Jacen果然给力!不但加入了标准库还修改得更标准!从中我们也学习了!谢谢!
回复

使用道具 举报

2

主题

44

帖子

348

积分

二级会员

Rank: 3Rank: 3

积分
348
发表于 2012-2-24 11:32:20 | 显示全部楼层

好东西,给力啊!

好东西,给力啊!
回复

使用道具 举报

0

主题

3

帖子

129

积分

一级会员

Rank: 2

积分
129
发表于 2012-2-27 12:58:23 | 显示全部楼层

很好,学习了!

很好,学习了!
回复

使用道具 举报

1

主题

6

帖子

45

积分

新手入门

Rank: 1

积分
45
发表于 2012-2-27 13:05:19 | 显示全部楼层

好东西,支持~·

好东西,支持~·
回复

使用道具 举报

1

主题

17

帖子

835

积分

三级会员

Rank: 4

积分
835
发表于 2012-2-28 10:38:32 | 显示全部楼层

很不錯,支持一下。

很不錯,支持一下。
回复

使用道具 举报

2

主题

72

帖子

517

积分

三级会员

Rank: 4

积分
517
发表于 2012-2-29 00:44:21 | 显示全部楼层

不错的功能,收藏了

不错的功能,收藏了
回复

使用道具 举报

5

主题

74

帖子

455

积分

二级会员

Rank: 3Rank: 3

积分
455
发表于 2012-3-10 00:24:42 | 显示全部楼层

真是好贴,谢谢分享

真是好贴,谢谢分享
回复

使用道具 举报

1

主题

33

帖子

192

积分

一级会员

Rank: 2

积分
192
发表于 2012-5-2 17:57:28 | 显示全部楼层

谢谢分享

谢谢分享
回复

使用道具 举报

5

主题

31

帖子

226

积分

二级会员

Rank: 3Rank: 3

积分
226
发表于 2012-5-3 22:04:44 | 显示全部楼层

学习了

学习了
回复

使用道具 举报

0

主题

55

帖子

367

积分

二级会员

Rank: 3Rank: 3

积分
367
QQ
发表于 2013-2-27 06:49:02 | 显示全部楼层

谢谢分享


谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-1-23 17:54 , Processed in 0.078129 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表