保捱科技网
您的当前位置:首页PowerBuilder动态创建菜单

PowerBuilder动态创建菜单

来源:保捱科技网
PB动态创建菜单

API声明:

FUNCTION ulong AppendMenu(ulong hMenu,ulong wFlags,ulong wIDNewItem,ref string lpNewItem) LIBRARY \"user32.dll\" ALIAS FOR \"AppendMenuA\"

FUNCTION ulong GetSubMenu(ulong hMenu,ulong nPos) LIBRARY \"user32.dll\" FUNCTION ulong GetMenu(ulong hwnd) LIBRARY \"user32.dll\" 1。在窗口的open事件中写上创建代码: int li_menuitem//需在第几项动态创建

int li_menuid//动态创建菜单的ID值(唯一性标识) ulong lu_menuhandle//菜单句柄

string ls_menuname//动态创建菜单的显示文本 li_menuitem=1 li_menuid=10001

ls_menuname='动态动单'

lu_menuhandle=GetSubMenu(GetMenu(handle(windowname)),li_menuitem) AppendMenu(lu_menuhandle,0,li_menuid,ls_menuname) 2。在窗口中新增一事件,事件ID为pbm_command if childid=10001 then

messagebox('','dynamic menu') end if

根据数据库中的一个表,自动生成菜单,设计表结构如下: t_menu 

m_id:关键字,序号 

m_pos:菜单项的位置,varchar类型,(数据类型对后面的排序很重要),如记事本中的文件/另存为:\"14\编辑/撤消:\"21\" m_text:菜单显示文本名字 

m_tag:标识菜单功能,用于后面区别调用各自clicked事件代码  

创建两个菜单其中个为m_main(空的),挂在窗口上的基本菜单,另外一个为m_new(临时),该菜单只有主菜单一个ITEM,其下没有进一步的子菜单;新建一下datawindow对象d_nemu,数据为t_menu中的所有行列,且按m_pos升序排列.   

具体代码  

menu lm_new[],lm_main 

long ll_i,ll_rowcount,ll_k,ll_itemcount string ls_pos,ls_name,ls_tag int ii_count  

ll_rowcount = dw_menu.rowcount() //dw_menu.dataoject为d_nemu   

for ll_i = 1 to ll_rowcount  

      //新创建一个菜单对象,并将其放到菜单数组im_new[]当中;       ii_count++ 

      lm_new[ii_count]=create m_new  

          ls_pos = dw_menu.getitemstring(ll_i,\"m_pos\") 

          ls_name = dw_menu.getitemstring(ll_i,\"m_name\")           ls_tag = dw_menu.getitemstring(ll_i,\"m_tag\")  

      //此处对新创建的菜单对象获取引用;          lm_main = m_main 

         for ll_k = 1 to len(ls_pos) ‐ 1  

             lm_main = lm_main.item[integer(mid(ls_pos,ll_k,1))]          next  

         lm_main.item[integer(right(ls_pos,1))] = lm_new[ii_count].item[1]          lm_main.item[integer(right(ls_pos,1))].text= ls_name          lm_main.item[integer(right(ls_pos,1))].tag = ls_tag          lm_main.item[integer(right(ls_pos,1))].hide()          lm_main.item[integer(right(ls_pos,1))].show()  

next     

clicked事件  

if upperbound(this.item[]) > 0 then  

      return  

end if  

choose case this.tag  

     case \"1\" 

                .....调用相关功能函数如\"打开\"      case \"2\"   

     case else  

          return ‐1  

end choose 

因篇幅问题不能全部显示,请点此查看更多更全内容