pbapi:PB中用Windows API制作位图菜单

  摘要:本文介绍了个利用Windows API来制作位图菜单思路方法具有较强实用价值

  关键词:Windows API;动态链接库;PowerBuilder

  许多优秀软件Software在窗口菜单左边显示个小图片例如Word这种菜单图文并茂使操作者感到非常直观而对于PowerBuilder来说它为应用开发了几百个简单实用地对于开发应用已经足够并不需要扩展然而我们经常希望为最终用户提供些PowerBuilder并不能提供功能例如这种位图菜单这时我们就需要外部

  外部是用其他语言编写并且存储在动态链接库(DLL)中个DLL就是个包含可以执行Windows代码文件DLL在运行时被动态地装入和链接并且可被多个应用共享DLL在内存中可以被移动或者固定可预装入或者命令装入也可以删除或者永久装入开发者在使用外部的前必须先对其进行定义外部根据作用域区别而分为两种类型:全局外部和局部外部在PowerBuilder中定义外部语法相当简单定义时根据有无返回值分别使用两种关键字:FUNCTION()和SUBROUTINE(子)

  在PowerBuilder中我们也可以通过Windows API来实现此项功能利用Windows API能够实现许多PowerBuilder不能实现功能

  下面通过个例子来叙述如何通过Windows API实现位图菜单在本例子中假设在创建个应用对象Application的后再分别创建个菜单对象m_和窗口对象w_在菜单对象m_中有如下菜单项:File/New、File/Open、File/Save、File/Exit、Edit/Copy、Edit/Cut、Edit/Paste和Edit/Delete在窗口对象w_将其"Title"属性设置为"位图菜单"并且将菜单"w_"关连到窗口"w_"上

  1)首先为窗口w_声明局部外部

  FUNCTION ulong LoadImageA(ulong hance, filename,u utype, x, y,u fload) & LIBRARY "USER32.DLL"
//该实现装入图象数据功能
FUNCTION boolean SetMenuItemBitmaps(ulong hmenu,u upos,u flags,&
ulong handle_bm1,ulong handle_bm2) LIBRARY "USER32.DLL"
//该设置菜单位图
FUNCTION GetMetrics( nIndex ) LIBRARY "USER32.DLL"
//该获取菜单位图尺寸
FUNCTION ulong GetMenuItemID(ulong hMenu,u uItem) LIBRARY "USER32.DLL"
//该获取菜单项目ID号
FUNCTION GetSubMenu (ulong hMenu, pos) LIBRARY "USER32.DLL"
//该获取子菜单项句柄
FUNCTION ulong GetMenu(ulong hWindow) LIBRARY "USER32.DLL"
//该获取应用菜单项
FUNCTION boolean ModyMenu(ulong hMnu, ulong uPosition, ulong uFlags, &
ulong uIDNewItem, long lpNewI) alias for ModyMenuA LIBRARY "USER32.DLL"
//该用来更新菜单项


  2)其次为窗口w_声明例子变量

  //Win32常量
CONSTANT Integer IMAGE_BITMAP = 0
CONSTANT Integer LR_LOADFROMFILE = 16
CONSTANT Integer SM_CXMENUCHECK = 71
CONSTANT Integer SM_CYMENUCHECK = 72
CONSTANT Integer MF_BITMAP = 4
CONSTANT Integer MF_BYPOSITION = 1024
3)最后给窗口w_Open事件添加脚本

  long ll_MainHandle
long ll_SubMenuHandle
eger li_MenuItemID
long ll_X
long ll_Y
long ll_BitmapNew
long ll_BitmapOpen
long ll_BitmapSave
long ll_BitmapExit
long ll_BitmapCopy
long ll_BitmapCut
long ll_BitmapPaste
long ll_BitmapDelete
//取得菜单句柄
ll_MainHandle = GetMenu(Handle(this))
//取得第个菜单项句柄
ll_SubMenuHandle = GetSubMenu(ll_MainHandle,0)
//装入图像数据
ll_BitmapNew = LoadImageA(0,'.bmp',IMAGE_BITMAP,0,0,LR_LOADFROMFILE)
ll_BitmapOpen = LoadImageA(0,'open.bmp',IMAGE_BITMAP,0,0,LR_LOADFROMFILE)
//取得第个子菜单项ID并修改菜单
li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,0)
ModyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapNew)
//取得第 2个子菜单项ID并修改菜单
li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,1)
ModyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapOpen)
//取得菜单缺省check-mark位图尺寸
ll_x = GetMetrics(SM_CXMENUCHECK)
ll_y = GetMetrics(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_BitmapSave)
SetMenuItemBitmaps(ll_SubMenuHandle,3,MF_BYPOSITION,ll_BitmapExit,ll_BitmapExit)
//取得第 2个菜单项句柄
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)
//取得第个子菜单项ID并修改菜单
li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,0)
ModyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapCopy)
//取得第 2个子菜单项ID并修改菜单
li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,1)
ModyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapCut)
//取得菜单缺省check-mark位图尺寸
ll_x = GetMetrics(SM_CXMENUCHECK)
ll_y = GetMetrics(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_SubMenuHandle,2,MF_BYPOSITION,ll_BitmapPaste,ll_BitmapPaste)
SetMenuItemBitmaps(ll_SubMenuHandle,3,MF_BYPOSITION,ll_BitmapDelete,ll_BitmapDelete)




  上面代码知识如何设置File和Edit子菜单项脚本至此整个应用制作完毕用户在运行该时便可以得到带位图菜单项本例在PowerBuilder7.0中运行通过如下图显示

  从上面设置菜单位图脚本中我们可以看到菜单可以带有两种区别类型图标:完全位图菜单和文字和位图共存菜单用户在实际开发中可以根据自己喜好选择相应类型值得注意用户在制作应用必须提供相应位图否则将会出错



Tags:  windowsapi教程 windowsapi函数 windowsapi pbapi

延伸阅读

最新评论

发表评论