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