WinCE 开始菜单StartMenu_Create()函数代码分析
//=====================================================================================================
//AUTHOR:
//??norains
//DATE:
//??Saturday 4-Mar-2006
//=====================================================================================================
windows ce 的開始菜單的子項(xiàng)可以通過(guò)更改注冊(cè)表來(lái)更改,但只能對(duì)有限的子項(xiàng)進(jìn)行更改.如果想要對(duì)開始菜單進(jìn)行更為詳盡的設(shè)置,必須要對(duì)代碼下手.開始菜單位于"$(_WINCEROOT)/PUBLIC/SHELL/OAK/HPC/EXPLORER/TASKBAR/stmenu.cpp.由于代碼眾多,再此只對(duì)菜單的創(chuàng)建函數(shù)StartMenu_Create()做一個(gè)注釋.下面這個(gè)例子的菜單只有"設(shè)置"和"程序"兩個(gè)子項(xiàng)
HMENU StartMenu_Create(VOID)
/*---------------------------------------------------------------------------*/
?*
/*---------------------------------------------------------------------------*/
{
?BOOL fOK= FALSE;
?HMENU hmenu;
?BITMAP bm;
?HDC hdc;
?int i;
?
?//創(chuàng)建"設(shè)置"菜單
?HMENU hmenuSettings = StartMenu_CreateSettingsMenu();
?if (!hmenuSettings) {
??return NULL;
?}
?//如果無(wú)法創(chuàng)建下級(jí)彈出菜單,則跳出此函數(shù)
??? hmenu = CreatePopupMenu();
?if (!hmenu) {
??FileMenu_Destroy(hmenuSettings);
??return 0;
?}
??
?// 開始菜單
?for (i=0; i<START_NUM_STATIC_ITEMS; i++) {
??//如果不存在peghelp.exe文件,將去掉"Help"子項(xiàng)
??if((IDM_START_HELP == stmenuData[i].idMenuCmd) && (GetFileAttributes(L"//Windows//peghelp.exe") == -1))
???continue;
?
??//如果注冊(cè)表設(shè)置不采用掛起,則將"掛起"子項(xiàng)去掉(是否采用分隔符也可以在注冊(cè)表設(shè)定)
??if ((IDM_START_SUSPEND == stmenuData[i].idMenuCmd) || (0 == stmenuData[i].idMenuCmd))
??????? {
??????????? DWORD dwLen;
??????????? DWORD dwValue;
??????????? HKEY? hkey;
???????????
??????????? dwValue = TRUE;?// 設(shè)置默認(rèn)值
??????????? dwLen = sizeof(dwValue);
??????????? if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, L"Explorer", 0, KEY_READ, &hkey ) == ERROR_SUCCESS )
??????????? {
??????????????? RegQueryValueEx(hkey, L"Suspend", NULL, NULL, (LPBYTE)&dwValue, &dwLen );
??????????????? RegCloseKey( hkey );
??????????? }
??????????? if (FALSE == dwValue) {
??????????????? continue;
??????????? }
??}
??if (0 == idFirstMenu) {
???idFirstMenu = stmenuData[i].idMenuCmd;
??}
??idLastMenu = stmenuData[i].idMenuCmd;
?
??if (stmenuData[i].idMenuIcon) {
???if (stmenuData[i].idMenuCmd == IDM_START_SETTINGS){
????// 插入"設(shè)置"菜單
????fOK = AppendMenu(hmenu,? MF_OWNERDRAW | MF_POPUP,
???????? (UINT)hmenuSettings, (LPCTSTR)&stmenuData[i]);
???}
???
???//*--------------------------------------------------------------------------------------------------------------
???//此段代碼管理"運(yùn)行","掛起"???
???else if (!stmenuData[i].nSpecialFolder ||
??????? (stmenuData[i].nSpecialFolder == STATIC_ITEM)) {
????// insert standard menu item
????//if(stmenuData[i].idMenuCmd!=IDM_START_RUN ||stmenuData[i].idMenuCmd!=IDM_START_SUSPEND )? //my adding:不添加"運(yùn)行","掛起"選項(xiàng)
????//ori:?{fOK = AppendMenu(hmenu, MF_OWNERDRAW, stmenuData[i].idMenuCmd,(LPCTSTR) &stmenuData[i]);}
???}
???//--------------------------------------------------------------------------------------------------------------*/
???
???
???//*-----------------------------------------------------------------------------------------------------?
???//此段代碼管理:"程序","收藏","文檔";
???
???//++++++++++++++++++++++++++
???//:my adding
???//不添加"收藏","文檔"選項(xiàng)
???else if(stmenuData[i].idMenuCmd == IDM_START_FAVORITES ||stmenuData[i].idMenuCmd == IDM_START_DOCUMENTS)
????{;}
???//++++++++++++++++++++++++++
???
???else{
????// insert cascade item
????// my explanation:cascade menu指的是帶有下級(jí)彈出菜單的,standard menu是單獨(dú)的,沒(méi)有下級(jí)彈出菜單的????
????HMENU hmenuSubMenu;
????LPITEMIDLIST pidl;
????if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, stmenuData[i].nSpecialFolder, &pidl))) {
??? ????hmenuSubMenu = FileMenu_CreatePopupWithPIDL(pidl);//創(chuàng)建彈出的下級(jí)菜單
??? ????fOK = AppendMenu(hmenu,? MF_OWNERDRAW | MF_POPUP,
??? ???????? (UINT)hmenuSubMenu,
??? ???????? (LPCTSTR)&stmenuData[i]);
??????????????? }??? ????????
???}
???//-------------------------------------------------------------------------------------------------------*/
???
??}else{
??? //fOK = AppendMenu(hmenu,MF_SEPARATOR, 0,0); //創(chuàng)建一個(gè)菜單分割符
??}
??ASSERT(fOK);
?}
?if (g_fUseSTBitmap)
?{
??hdc = GetDC(NULL);
??if (GetDeviceCaps(hdc, BITSPIXEL) == 2) {
???hbmSTPegasus = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_STPEGASUSG));
??}else{
???hbmSTPegasus = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_STPEGASUS));
??}
??ReleaseDC(NULL, hdc);
??GetObject(hbmSTPegasus, sizeof(BITMAP), &bm);
??sizeSTPegasus.cx = bm.bmWidth;
??sizeSTPegasus.cy = bm.bmHeight;
?}
?else
?{
??hbmSTPegasus = NULL;
??sizeSTPegasus.cx = 0;
??sizeSTPegasus.cy = 0;
?}
?return hmenu;
?
} /* StartMenu_Create() */
轉(zhuǎn)載于:https://www.cnblogs.com/wodeyitian/archive/2006/03/04/2460575.html
總結(jié)
以上是生活随笔為你收集整理的WinCE 开始菜单StartMenu_Create()函数代码分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 松下SW-9585-C全功能DVD刻录机
- 下一篇: LED适用范围及寿命