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

PB: 使 PB 支持单选菜单项

到目前的 Version 11 Beta 2 为止,PB 仍不支持如图1 所示的单选菜单项。但实际应用中,我们需要用类似的菜单来选择字体大小、缩放比例等等。如果用复选菜单项代替的话,也不尽如人意。本文将介绍使用 Win32 API 函数来实现单选菜单项。

图1图1

这里笔者先创建菜单对象 m_base,并声明 Local External Function 的 Powersoft 原型:

function ulong GetMenu(ulong hWnd) library "user32.dll"  //获取指定窗口的菜单句柄

function ulong GetSubMenu(ulong hMenu, long nPos) library "user32.dll" //获取指定菜单的子菜单

function boolean CheckMenuRadioItem(ulong hmenu, ulong idFirst, ulong idLast, ulong idCheck, ulong uFlags) library "user32.dll" //在指定菜单上设置单选菜单项

建议将参数 uFlags 设为 MF_BYPOSITION(1024),而非 MF_BYCOMMAND(0) 以避免要预先获取 COMMANDID 的麻烦。

定义 m_base 的方法 position:

public function integer position (menu menuitem)
/************************************************************************************
用途:获取指定菜单项在菜单中的位置
参数:
    menuItem  待确定位置的菜单项
返回值:
    如果菜单有效且菜单项是可见的,则返回非0值;否则,返回0。
***********************************************************************************
*/

int            i, j, n
menu        mParent

mParent 
= menuItem.GetParent( )
if not IsValid(mParent) then return 0

= upperBound(mParent.Item)
for i = 1 to n
    
if mParent.Item[i].visible then
        j 
++
        
if mParent.Item[i] = menuItem then return j
    end 
if
next

return 0
end function

注意,由于 PB 不会使用 Win32 API 函数 InsertMenuItem( ) 创建 visible = false 的菜单项 (但其 COMMANDID 仍被预留),所以在计算位置时要跳过不可见的菜单项。

定义 m_base 的方法 handle:

public function long handle (menu menuitem)
/***********************************************************************
用途:获取指定菜单项的菜单句柄
参数:
    menuItem    待确定菜单句柄的菜单项
返回值:
    返回菜单句柄
***********************************************************************
*/

menu    mParent

mParent 
= menuItem.GetParent( )
if not IsValid(mParent) then
    
return GetMenu(handle(ParentWindow))
else
    
return GetSubMenu(handle(mParent), position(menuItem) - 1)
end 
if
end function

需要说明的是:

本身不是子菜单的菜单项是没有句柄的,只有菜单才有句柄。

所以方法 handle 获取的实际上是指定菜单项 (无论是否是子菜单) 所在的父菜单的句柄。

定义 m_base 的方法 checkradio:

public function boolean checkradio (menu itemfirst, menu itemlast, menu itemcheck)
/***************************************************************************************
用途:设置单选菜单项
参数:
    itemFirst    组里的第一个菜单项
    itemLast    组里的最后一个菜单项
    itemCheck 组里的被选中的菜单项
返回值:
    如果父菜单存在且 API 调用成功,则返回 TRUE;否则,返回 FALSE。
***************************************************************************************
*/

menu    mParent

mParent 
= itemFirst.GetParent( )
if IsValid(mParent) then
    
return CheckMenuRadioItem(handle(mParent), position(itemFirst) - 1&    
        position(itemLast) 
- 1, position(itemCheck) - 11024//MF_BYPOSITION
else
    
return false
end 
if
end function

现举例说明如何调用方法。如图2所示的菜单派生自菜单 m_base,菜单 m_view 的菜单项 m_largeIcon、m_smallIcon、m_list 和 m_detail 要构成一个单选菜单项的组,为此需定义 m_view 的 Clicked 事件脚本:

 图2图2 

event clicked
ListView    listCtrl

listCtrl 
= ParentWindow.dynamic GetLeftSideListCtrl( )
choose 
case listctrl.view
    
case ListViewLargeIcon!
        m_arrange.enabled 
= true
        CheckRadio(m_largeicon, m_detail, m_largeicon)
    
case ListViewSmallIcon!
        m_arrange.enabled 
= true
        CheckRadio(m_largeicon, m_detail, m_smallicon)
    
case ListViewList!
        m_arrange.enabled 
= true
        CheckRadio(m_largeicon, m_detail, m_list)
    
case ListViewReport!
        m_arrange.enabled 
= false
        CheckRadio(m_largeicon, m_detail, m_detail)
end choose
end 
event
ajax聊天室源码:【上一篇】
sql server procedure 导入/导出:【下一篇】
【相关文章】
  • pb的opensheet函数
  • pb中key事件中键盘输入的判断
  • jpbm如何获得流程所处的环节。
  • 在PB中自动注册Adaptive Server Anywhere 8.0 ODBC数据源
  • strpbrk ( )【C语言库函数源代码】
  • 為PB系統設計自動更新API
  • PB应用走向WEB的技术方案选择——Appeon for PowerBuilder WEB 发布和J2EE WEB应用重写方案的比较
  • APB .NET版本功能和技术特点
  • 使用DUMPBIN命令
  • PB中如何控制判断大写以及小键盘指示灯是否开启并与按键协调工作
  • 【随机文章】
  • 监视与维护连接
  • 用Winsock实现语音全双工通信使用
  • [原创]关于Windows、Freebsd和Linux多重系统引导问题
  • 关于HACMP的启动和关闭脚本!!
  • 服务器配置(1)
  • 傲气雄鹰——雏鹰
  • 汉字随机码
  • WLAN技术专辑:射频技术
  • Unicode简介
  • 构建安全的apache+mysql+php的web服务器
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.