位图菜单

上传人:kms****20 文档编号:41299686 上传时间:2018-05-29 格式:DOC 页数:5 大小:29.50KB
返回 下载 相关 举报
位图菜单_第1页
第1页 / 共5页
位图菜单_第2页
第2页 / 共5页
位图菜单_第3页
第3页 / 共5页
位图菜单_第4页
第4页 / 共5页
位图菜单_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《位图菜单》由会员分享,可在线阅读,更多相关《位图菜单(5页珍藏版)》请在金锄头文库上搜索。

1、位图菜单位图菜单位图菜单.txtPB 中用 Windows API 制作位图菜单许多优秀的软件在窗口菜单的左边显示一个小图片,例如 Word,这种菜单图文并茂,使操作者感到非常直观。而对于 PowerBuilder 来说,它为应用开发了几百个简单实用地函数,对于一般的开发应用已经足够,并不需要扩展函数。然而,我们经常希望为最终用户提供一些 PowerBuilder 并不能提供的功能,例如这种位图菜单,这时我们就需要外部函数。外部函数是用其他语言编写的并且存储在动态链接库(DLL)中的函数。一个 DLL 就是一个包含可以执行的 Windows 代码的文件。DLL 在运行时被动态地装入和链接,并且

2、可被多个应用程序共享。DLL 在内存中可以被移动或者固定,可预装入或者命令装入,也可以删除或者永久装入。开发者在使用外部函数之前,必须先对其进行定义,外部函数根据作用域的不同而分为两种类型:全局外部函数与局部外部函数。在 PowerBuilder 中定义外部函数的语法相当简单,定义函数时根据有无返回值分别使用两种关键字:FUNCTION(函数)和 SUBROUTINE(子程序) 。在 PowerBuilder 中,我们也可以通过 Windows API 函数来实现此项功能,利用 Windows API 函数能够实现许多 PowerBuilder 不能实现的功能。下面通过一个实例来叙述如何通过

3、Windows API 函数实现位图菜单。在本实例中,假设在创建一个应用对象 Application 之后,再分别创建一个菜单对象 m_main 和窗口对象 w_main。在菜单对象m_main 中有如下菜单项:File/New、File/Open、File/Save、File/Exit、Edit/Copy、Edit/Cut、Edit/Paste 和 Edit/Delete。在窗口对象 w_main 中,将其“Title“属性设置为“位图菜单“,并且将菜单“w_main“关连到窗口“w_main“上。1)首先为窗口 w_main 声明局部外部函数FUNCTION ulong LoadImage

4、A(ulong hintance, string filename,uint utype, int x,int y,uint fload) & LIBRARY “USER32.DLL“/该函数实现装入图象数据的功能FUNCTION boolean SetMenuItemBitmaps(ulong hmenu,uint upos,uint flags,&ulong handle_bm1,ulong handle_bm2) LIBRARY “USER32.DLL“/该函数设置菜单位图FUNCTION int GetSystemMetrics( int nIndex ) LIBRARY “USER3

5、2.DLL“/该函数获取菜单的位图尺寸FUNCTION ulong GetMenuItemID(ulong hMenu,uint uItem) LIBRARY “USER32.DLL“/该函数获取菜单项目的 ID 号FUNCTION int GetSubMenu (ulong hMenu,int pos) LIBRARY “USER32.DLL“/该函数获取子菜单项的句柄FUNCTION ulong GetMenu(ulong hWindow) LIBRARY “USER32.DLL“/该函数获取应用的菜单项FUNCTION boolean ModifyMenu(ulong hMnu, ulo

6、ng uPosition, ulong uFlags, &ulong uIDNewItem, long lpNewI) alias for ModifyMenuA LIBRARY “USER32.DLL“/该函数用来更新菜单项 2)其次为窗口 w_main 声明实例变量/Win32 常量CONSTANT Integer IMAGE_BITMAP = 0CONSTANT Integer LR_LOADFROMFILE = 16CONSTANT Integer SM_CXMENUCHECK = 71CONSTANT Integer SM_CYMENUCHECK = 72CONSTANT Integ

7、er MF_BITMAP = 4CONSTANT Integer MF_BYPOSITION = 10243)最后给窗口 w_main 的 Open 事件添加脚本long ll_MainHandlelong ll_SubMenuHandleinteger li_MenuItemIDlong ll_Xlong ll_Ylong ll_BitmapNewlong ll_BitmapOpenlong ll_BitmapSavelong ll_BitmapExitlong ll_BitmapCopylong ll_BitmapCutlong ll_BitmapPastelong ll_BitmapDe

8、lete/取得菜单句柄 ll_MainHandle = GetMenu(Handle(this)/取得第一个菜单项的句柄ll_SubMenuHandle = GetSubMenu(ll_MainHandle,0)/装入图像数据ll_BitmapNew = LoadImageA(0,new.bmp,IMAGE_BITMAP,0,0,LR_LOADFROMFILE)ll_BitmapOpen = LoadImageA(0,open.bmp,IMAGE_BITMAP,0,0,LR_LOADFROMFILE)/取得第一个子菜单项的 ID 并修改菜单li_MenuItemID = GetMenuItem

9、ID(ll_SubMenuHandle,0)ModifyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapNew)/取得第二个子菜单项的 ID 并修改菜单li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,1)ModifyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapOpen)/取得菜单缺省 check-mark 位图的尺寸ll_x = GetSystemMetrics(SM

10、_CXMENUCHECK) ll_y = GetSystemMetrics(SM_CYMENUCHECK) /按系统尺寸装入图像ll_BitmapSave = LoadImageA(0,save.bmp, IMAGE_BITMAP ,ll_x,ll_y,LR_LOADFROMFILE)ll_BitmapExit= LoadImageA(0,exit.bmp, IMAGE_BITMAP ,ll_x,ll_y,LR_LOADFROMFILE)/设置菜单位图SetMenuItemBitmaps(ll_SubMenuHandle,2,MF_BYPOSITION,ll_BitmapSave,ll_Bit

11、mapSave)SetMenuItemBitmaps(ll_SubMenuHandle,3,MF_BYPOSITION,ll_BitmapExit,ll_BitmapExit)/取得第二个菜单项的句柄Ll_SubMenuHandle = GetSubMenu(ll_MainHandle,1)/装入图像数据ll_BitmapCopy = LoadImageA(0,copy.bmp,IMAGE_BITMAP,0,0,LR_LOADFROMFILE)ll_BitmapCut = LoadImageA(0,cut.bmp,IMAGE_BITMAP,0,0,LR_LOADFROMFILE)/取得第一个子

12、菜单项的 ID 并修改菜单li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,0)ModifyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapCopy)/取得第二个子菜单项的 ID 并修改菜单li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,1)ModifyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapCut)/取得菜单缺省 ch

13、eck-mark 位图的尺寸ll_x = GetSystemMetrics(SM_CXMENUCHECK) ll_y = GetSystemMetrics(SM_CYMENUCHECK) /按系统尺寸装入图像ll_BitmapPaste=LoadImageA(0,paste.bmp, IMAGE_BITMAP ,ll_x,ll_y,LR_LOADFROMFILE)ll_BitmapDelete=LoadImageA(0,delete.bmp, IMAGE_BITMAP ,ll_x,ll_y,LR_LOADFROMFILE)/设置菜单位图SetMenuItemBitmaps(ll_SubMenu

14、Handle,2,MF_BYPOSITION,ll_BitmapPaste,ll_BitmapPaste)SetMenuItemBitmaps(ll_SubMenuHandle,3,MF_BYPOSITION,ll_BitmapDelete,ll_BitmapDelete)上面的代码知识如何设置 File 与 Edit 子菜单项的脚本。至此整个应用程序制作完毕,用户在运行该程序时便可以得到带位图的菜单项,本例在 PowerBuilder7.0 中运行通过。如下图显示。从上面设置菜单位图的脚本中我们可以看到,菜单可以带有两种不同类型的图标:完全位图菜单和文字与位图共存菜单。用户在实际开发中可以根据自己的喜好选择相应的类型。值得注意的是,用户在制作应用程序时,必须提供相应的位图,否则将会出错。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号