|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
Cluster/NDB高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用菜单
菜单列举记
有一MDI使用程序,现假定要列举出其可以失掉体系命令呼应一切菜单项的内容:如命令ID,资本称号,地点(子)菜单的句柄等,并对之举行操纵。本文对此略述一二,未达意处,看列位包涵以外,以我之深度,唯与诸位共勉罢了。
1、我的利诱
这几天修炼EnglishHelp,悟得些许正果,但愿得与众人共超,尚不知是不是无效,但为之罢了。言回正传:
菜单项能够是菜单,反之亦然,此时菜单被称为子菜单;假如菜单项不是菜单,则它即是’纯菜单项’。之前我觉得菜单中每项都是菜单,我的头脑中因而不再有菜单项的界说。大概这是个菜鸟级成绩,但也大概您尚不甚解,那您无妨夸夸其谈一番,将最复杂的菜单画上一画,再揣摩揣摩。
2、菜单列举算法
A、菜单笼统布局之一(树型笼统):
如今要会见到这棵’树’的一切叶结点并处置之,办法如B所述。
B、列举算法(深度遍历,C++语法)
1.)求妥当前结点的子结点数c;
2.)轮回查询以后结点的I(0<=I<c)子结点信息:
若该子结点I无上级子结点,则子结点I为叶结点,按需处置后,作I=I+1,反复此步骤;
不然子结点I为分枝结点,置上级子结点为以后结点,转向1;
3.)遍历终了。
intFindMenuItem(HMENUhmenu)//参数hmenu为分支结点资本标识
{
inti,c;
longres;
char*s=newchar[33];
MENUITEMINFOmii;
mii.cbSize=sizeof(MENUITEMINFO);
mii.fMask=MIIM_DATA|MIIM_ID|MIIM_SUBMENU|MIIM_TYPE|MIIM_STATE|MIIM_CHECKMARKS;
mii.dwTypeData=s;
c=GetMenuItemCount(hmenu);//猎取以后菜单一切的菜单项数量
for(i=0;i<c;i++)
{
mii.cch=32;//注重哦!
res=GetMenuItemInfo(hmenu,i,true,&mii);
if(res==0){deletes;return-1;}//假如猎取菜单信息失利
if(mii.hSubMenu==NULL)//
{
//若该菜单项非子菜单,则在此作响应处置
}
else
{
//若该菜单项为子菜单,则云云处置
res=FindMenuItem(mii.hSubMenu);//间接递回挪用
if(res==-1){deletes;return-1;}
}
}
deletes;
return0;
}
intEnumMenuEndItems(HWNDhwnd)//入手下手遍历窗口菜单项。参数hwnd为菜单地点的窗体。
{
HMENUhmenu=GetMenu(hwnd);
if(hmenu==NULL)returnC1;
returnFindMenuItem(hmenu);
}
注:此处代码仅仅形貌算法。若使用到它处,依据分歧的必要,Function的前往值和结点处置代码天经地义要产生改动。
附录2为上述代码的PB文本,二者略有分歧,以资参考。
上面对上述代码顶用到的Windowsapi及struct稍作讲授。
3、在的所用开辟工具中Declare以下WindowsAPI及相干Struct(尺度格局):
HMENUGetMenu(HWNDhWnd);//前往值:hWnd所联系关系的窗口的菜单句柄
HMENUGetSubMenu(HMENUhMenu,intnPos);//前往值:hMenu所联系关系的菜单中第nPos项的子菜单句柄
intGetMenuItemCount(HMENUhMenu);//前往值:hMenu所联系关系的菜单中的菜单项数量
BOOLWINAPIGetMenuItemInfo(
HMENUhMenu,
UINTuItem,
BOOLfByPosition,//该参数断定uItem为以后菜单项的命令标识仍是在所属菜单中的排序地位号
LPMENUITEMINFOlpmii);
BOOLDrawMenuBar(HWNDhWnd);//重绘hWnd所联系关系的窗口的菜单
typedefstructtagMENUITEMINFO{
UINTcbSize;//本布局体物理巨细,以byte为单元,其值实践上为48
UINTfMask;//断定想要查询或设置菜单项的哪能些内容
UINTfType;//菜单格局范例
UINTfState;//菜单形态:Enabled、DisabledorGrayed
UINTwID;//命令标识符
HMENUhSubMenu;//子菜单句柄,若无子菜单则为NULL
HBITMAPhbmpChecked;//依据这两个域值,能够自界说菜单项被选准时的标志,
HBITMAPhbmpUnchecked;//而纷歧定如果’√’或空缺
DWORDdwItemData;//由English翻译为:使用程序界说的与菜单项相干的值(我也不分明)
LPTSTRdwTypeData;//菜单资本内容指针,指向StringorBitMaporSEPARATOR资本
UINTcch;//若菜单项为MFT_STRING范例,则此项为dwTypeData长度
HBITMAPhbmpItem;//在调试程序时发明有此一项
}MENUITEMINFO,FAR*LPMENUITEMINFO;
参考材料:MSDN98(MicroSoft)MSSDKHelpFilesWin32Developer’sReferences(Inprise/Borland)
(附录1为上述API在PB中的Declare文本)
与Menu操纵相干的WindowsAPIFunctions还对照多,可过度参考,静态库:USER32.DLL。
4、别的:
a、.我在PB7中挪用这些Windows功效,但在调试至GetMenuItemInfo时,单步运转却故步自封,约
30小时后,我举行了以下操纵:
a1、翻开一Dos窗口,运转TDumpc:windowsystemuser32.dll>user32.txt(Tdump.exe为Inprise公司的使用程序)
a2、回到Windows中,以记事本翻开user32.txt,发明个中并没有GetMenuItemInfo,但有GetMenuItemInfoA,若在VB中挪用过WINAPI,则可推测此为什么物。
a3、将GetMenuItemInfo改写(或Alias)成GetMenuItemInfoA,便OK了!
b、菜单项命令标识符感化
在挪用GetMenuItemInfoA以后,其值保留在MENUITEMINFO::wID中。
设如今取得一菜单项信息存储于MENUITEMINFO型布局体mii中,其部份内容为:
mii.cbsize=48
mii.dwTypeData=”翻开文件”
mii.wID=10001
mii.fState=Enabled
mii.fType=MFT_STRING
对应函数援用标识
命令标识符wID
OpenFile()
10001
CloseFile()
10002
wID=10001
C、在上述GetMenuItemInfoA挪用时,需对MENUITEMINFO的以下域赋值:
MENUITEMINFO::cbSize
MENUITEMINFO::fMask
MENUITEMINFO::dwTypeData
MENUITEMINFO::cch
个中MENUITEMINFO::fMask可为以下常数值的组合(在相干材料中很难查到这些常数数值)
MIIM_STATE(=1)MIIM_ID(=2)
MIIM_SUBMENU(=4)MIIM_CHECKMARKS(=8)
MIIM_TYPE(=16)MIIM_DATA(=32)
附:
1、相干API及布局体在PB中的Declare
FunctionLongGetMenu(longhWnd)LIBRARY"USER32.DLL"
FunctionLongGetSubMenu(longhMenu,longnPos)LIBRARY"USER32.DLL"
FunctionLongGetMenuItemCount(longhMenu)LIBRARY"USER32.DLL"
FunctionLongEnableMenuItem(longhMenu,UlonguIDEnableItem,UlonguEnable)LIBRARY"USER32.DLL"
FunctionLongGetMenuItemInfoA(longhMenu,UlonguItem,longfByPosition,refMENUITEMINFOmii)LIBRARY"USER32.DLL"
FunctionLongDrawMenuBar(longhwnd)LIBRARY"USER32.DLL"
globaltypemenuiteminfofromstructure
unsignedlongcbsize
unsignedlongfmask
unsignedlongftype
unsignedlongfstate
unsignedlongwid
longhsubmenu
longhbmpchecked
longhbmpunchecked
longdwitemdata
stringdwtypedata
unsignedlongcch
longhbmpitem
endtype
2、PB代码,依据必要,分歧于C++代码(节选,有修正)
PublicFunctionIntEnumMenuEndItems(longhwnd,intins_upd)
longhm
constantintins=0
ifhwnd=0orisnull(hwnd)thenreturn0
hm=GetMenu(handle(wmdi))
ifins_upd=insthen
deletefromsec_funusingtrans;
IFTRANS.SQLCODE=-1THENgotoerror
endif
ifismenu(hm)=0thenreturn-1
iffun(hm,ins_upd)=-1thengotoerror
IFTRANS.SQLCODE=-1THENgotoerror
COMMITUSINGTRANS;
deletefromsec_authwhereid_funnotin(selectid_funfromsec_fun)usingtrans;//对
iftrans.sqlcode=-1andins_upd=insthenmessagebox("","某些操纵大概不再存在,但用户仍旧具有该项操纵权限,请手动删除!")
return0
error:
ROLLBACKUSINGTRANS;
RETURNC1
EndFuction
PrivateFunctionIntFindMenuItem(HMENUhmenu,intins_upd)
//ins=0
//upd=1
inti,c
longhm,res
menuiteminfomii
mii.cbsize=48
mii.fmask=54
MII.FTYPE=0
c=getmenuitemcount(hmenu)
fori=0toc-1
mii.dwtypedata=""
mii.cch=63
ifnotisvalid(mii)thenreturn-1
res=GetMenuItemInfoA(hmenu,i,255,mii)
ifres=0thencontinue
IFMII.HSUBMENU=0THEN
IFNOTISNULL(MII.DWTYPEDATA)THEN
choosecaseins_upd
case0
insertintosec_fun(id_fun,des_fun,HANDLE)values(:mii.wid,:mii.dwTypeData,:hmenu)USINGTRANS;//保留’纯’菜单项的信息
IFTRANS.SQLCODE=-1THENreturn-1
case1
updatesec_funsetHANDLE=:hmenuwhereid_fun=:mii.widUSINGTRANS;
IFTRANS.SQLCODE=-1THENreturn-2
endchoose
ELSE
CONTINUE
ENDIF
ELSE
res=FindMenuItem(MII.HSUBMENU,ins_upd)
ifres0thenreturnres
ENDIF
NEXT
return0
EndFunction
有了rowbase的binlog后,我们来分析一下怎么实现闪回。平时的DML无非三种操作,增删改,先说三种操作的日志格式。 |
|