搜索
aardio官方社区 门户 查看主题

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

发布者: xauto | 发布时间: 2012-2-20 01:08| 查看数: 14758| 评论数: 19|帖子模式

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, 下载次数: 412)

评分

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

查看全部评分

最新评论

xauto 发表于 2012-2-20 01:40:06

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

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

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

好久不见,LZ辛苦了~!给许多朋友带来了福音!
imapod 发表于 2012-2-20 12:28:52

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

图文并茂 还有分析过程 很好 很精彩 谢谢楼主的分享
coder 发表于 2012-2-20 15:00:02

期待楼 主更多分享,谢谢

期待楼 主更多分享,谢谢
MMiao79 发表于 2012-2-20 16:21:59

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

{:soso_e102:}  这东西相当有价值啊!谢谢楼主贡献!希望可以直接加入标准库就好了!!!
难得糊涂 发表于 2012-2-20 16:24:30

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

厉害的作品呐~~~~!!!!
sj798 发表于 2012-2-20 18:01:49

支持楼主,强人一个

支持楼主,强人一个
Jacen.He 发表于 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 )

MMiao79 发表于 2012-2-23 23:55:20

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

  Jacen果然给力!不但加入了标准库还修改得更标准!从中我们也学习了!谢谢!
feixiang2920 发表于 2012-2-24 11:32:20

好东西,给力啊!

好东西,给力啊!
lukewang 发表于 2012-2-27 12:58:23

很好,学习了!

很好,学习了!
莫寒尘 发表于 2012-2-27 13:05:19

好东西,支持~·

好东西,支持~·
rchockxm 发表于 2012-2-28 10:38:32

很不錯,支持一下。

很不錯,支持一下。
gxrcn 发表于 2012-2-29 00:44:21

不错的功能,收藏了

不错的功能,收藏了
cnhope 发表于 2012-3-10 00:24:42

真是好贴,谢谢分享

真是好贴,谢谢分享
988668 发表于 2012-5-2 17:57:28

谢谢分享

谢谢分享
fexzi 发表于 2012-5-3 22:04:44

学习了

学习了
wjmcu 发表于 2013-2-27 06:49:02

谢谢分享


谢谢分享
12下一页

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

GMT+8, 2017-9-22 07:08 , Processed in 0.078125 second(s), 27 queries , Wincache On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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