首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 冲浪宝典 > 网络资源 > PB: 带位图的菜单项实现
【标  题】:PB: 带位图的菜单项实现
【关键字】:PB
【来  源】:http://blog.csdn.net/keyssoft/archive/2007/01/11/1480686.aspx

PB: 带位图的菜单项实现

当读者在使用 Microsoft Word 97 时,是否曾注意到 Word 的部分菜单项旁有一个小巧的图标 (如图1所示),初次见到时,是否有耳目一新的感觉,是否想过让 PowerBuilder 创建的菜单项和他一样漂亮。只可惜 Sybase 至今仍未实现该功能,令得广大的 PowerBuilder 用户只能去羡慕别人。不过文本将探讨如何用 PowerBuilder 和 Win32 API 来实现带位图的菜单项。

图1图1

相关的Win32 API函数

为了将位图与菜单项关联起来,必须调用 SetMenuItemBitmaps 函数。该函数可以改变 Checked 和 Unchecked 状态的图标,读者可以将缺省的勾号 (√) 改为开关或圆形按钮之类的更可爱的图标。我们要实现的带位图菜单项就靠该函数改变 Unchecked 状态图标。其 Powersoft 原型为:

Function Boolean SetMenuItemBitmaps(&
                   ULong hMenu, & /*子菜单的句柄*/
                   UINT uPosition, & /*菜单项在子菜单中的位置*/
                   UINT uFlags, & /*位置类型标志*/
                   ULong hBitmapUnchecked, & /*Unchecked状态对应的位图句柄*/
                   Ulong hBitmapChecked & /*Checked状态对应的位图句柄*/
           ) Library "User32.DLL" 

uFlags 为 MF_BYCOMMAND(0) 时,uPosition 得是该菜单项的标识号;MF_BYPOSITION(1024) 时,uPosition 得是基于 0 的相对位置。

然而,在调用 SetMenuItemBitmaps 函数前,必须调用 GetMenu 和 GetSubMenu 获取子菜单的句柄。 GetMenu 函数用于获取主菜单的句柄,GetSubMenu 函数用于获取子菜单的句柄。两函数的 Powersoft 原型为:

Function ULong GetMenu(ULong hWnd  /*窗口句柄*/ ) Library "User32.DLL"

Function ULong GetSubMenu(ULong hMenu /*主菜单句柄*/, int nPos /*相对位置*/) Library "User32.DLL"

在下面的例子中,还要用到 LoadImageA 和 DeleteObject 函数。LoadImageA 函数可从指定的地方加载位图,并返回位图的句柄。DeleteObject 函数删除与该位图相关的信息。他们的 Powersoft 原型为:

Function ULong LoadImageA(&
                   Ulong hinst, & /*应用程序实例句柄*/
                   String lpszName, & /*资源名*/
                   UInt uType, & /*资源类型*/
                   int cxDesired, & /*宽度*/
                   int cyDesired, & /*高度*/
                   UInt fuLoad & /*加载选项*/
           ) Library "User32.DLL"

Function Boolean DeleteObject(ULong hObject /*对象句柄*/ ) Library "GDI32.DLL"

实现举例

先在菜单对象 m_main 中声明一个实例变量:

Ulong hBitmaps[] //用来存放加载的所有位图句柄。

定义对象函数 Init 用于加载和设置位图:

m_main.Function Init( ) returns (None)
int  i
int  indexs[] = ...{0126}
ULong hMenu
String sBMPFiles[] 
= ...{".New.bmp"".Open.bmp"".Save.bmp"".Print.bmp"}

hMenu 
= GetSubMenu(GetMenu(Handle(ParentWindow)), 0//取子菜单句柄
For i = 1 To Upperbound(sBMPFiles)
    
//从文件加载位图(13x13 pixels)
    hBitMaps[i] =LoadImageA(0, sBMPFiles[i], 0131316)
    SetMenuItemBitmaps(hMenu, indexs[i], 
1024, hBitMaps[i], 0//建立关联
Next

定义对象函数 Fin 用于资源回收:

m_main.Function Fin( ) returns (None)
int i
For i 
= 1 to Upperbound(hBitMaps)
    DeleteObject(hBitMaps[i]) 
Next

读者可以在父窗口的 Open 事件脚本中调用 Init( ) 函数,在 Close 事件脚本中调用 Fin( ) 函数。 

Oracle & SQL 性能优化技巧:【上一篇】
oracle员工表精典查询:【下一篇】
【相关文章】
  • PB: 调用 Win32 公共控件的改进方案
  • PB: Windows 状态条控件在 PB 中的运用
  • PB: 也谈数据窗口自动换行
  • PB: 控件的 MS 类名和风格
  • PB: 谈 Create 和 OpenUserObject 创建 GraphicObject 对象的区别
  • PB: 使 PB 支持单选菜单项
  • pb的opensheet函数
  • pb中key事件中键盘输入的判断
  • jpbm如何获得流程所处的环节。
  • 在PB中自动注册Adaptive Server Anywhere 8.0 ODBC数据源
  • 【随机文章】
  • 一种Map与JavaBean可配置转换的实现
  • 在powerbuilder中使下拉列表框可以和数据关联
  • 编写健壮的代码初步
  • JDBCTM 入门指南(4)
  • 表单递交合法性检测-只允许填写字母  
  • 专线的介绍
  • 电脑开机黑屏的常用处理方法
  • (原创翻译)敏捷开发的必要技巧7--分离数据库访问,UI和域逻辑
  • [转载]自由战士: Richard Stallman
  • 配置J2EE支持Mysql
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.