WinCE 开始菜单StartMenu_Create()函数代码分析
//=====================================================================================================
//AUTHOR:
//??norains
//DATE:
//??Saturday 4-Mar-2006
//=====================================================================================================
windows ce 的開始菜單的子項可以通過更改注冊表來更改,但只能對有限的子項進行更改.如果想要對開始菜單進行更為詳盡的設置,必須要對代碼下手.開始菜單位于"$(_WINCEROOT)/PUBLIC/SHELL/OAK/HPC/EXPLORER/TASKBAR/stmenu.cpp.由于代碼眾多,再此只對菜單的創建函數StartMenu_Create()做一個注釋.下面這個例子的菜單只有"設置"和"程序"兩個子項
HMENU StartMenu_Create(VOID)
/*---------------------------------------------------------------------------*/
?*
/*---------------------------------------------------------------------------*/
{
?BOOL fOK= FALSE;
?HMENU hmenu;
?BITMAP bm;
?HDC hdc;
?int i;
?
?//創建"設置"菜單
?HMENU hmenuSettings = StartMenu_CreateSettingsMenu();
?if (!hmenuSettings) {
??return NULL;
?}
?//如果無法創建下級彈出菜單,則跳出此函數
??? hmenu = CreatePopupMenu();
?if (!hmenu) {
??FileMenu_Destroy(hmenuSettings);
??return 0;
?}
??
?// 開始菜單
?for (i=0; i<START_NUM_STATIC_ITEMS; i++) {
??//如果不存在peghelp.exe文件,將去掉"Help"子項
??if((IDM_START_HELP == stmenuData[i].idMenuCmd) && (GetFileAttributes(L"//Windows//peghelp.exe") == -1))
???continue;
?
??//如果注冊表設置不采用掛起,則將"掛起"子項去掉(是否采用分隔符也可以在注冊表設定)
??if ((IDM_START_SUSPEND == stmenuData[i].idMenuCmd) || (0 == stmenuData[i].idMenuCmd))
??????? {
??????????? DWORD dwLen;
??????????? DWORD dwValue;
??????????? HKEY? hkey;
???????????
??????????? dwValue = TRUE;?// 設置默認值
??????????? 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){
????// 插入"設置"菜單
????fOK = AppendMenu(hmenu,? MF_OWNERDRAW | MF_POPUP,
???????? (UINT)hmenuSettings, (LPCTSTR)&stmenuData[i]);
???}
???
???//*--------------------------------------------------------------------------------------------------------------
???//此段代碼管理"運行","掛起"???
???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:不添加"運行","掛起"選項
????//ori:?{fOK = AppendMenu(hmenu, MF_OWNERDRAW, stmenuData[i].idMenuCmd,(LPCTSTR) &stmenuData[i]);}
???}
???//--------------------------------------------------------------------------------------------------------------*/
???
???
???//*-----------------------------------------------------------------------------------------------------?
???//此段代碼管理:"程序","收藏","文檔";
???
???//++++++++++++++++++++++++++
???//:my adding
???//不添加"收藏","文檔"選項
???else if(stmenuData[i].idMenuCmd == IDM_START_FAVORITES ||stmenuData[i].idMenuCmd == IDM_START_DOCUMENTS)
????{;}
???//++++++++++++++++++++++++++
???
???else{
????// insert cascade item
????// my explanation:cascade menu指的是帶有下級彈出菜單的,standard menu是單獨的,沒有下級彈出菜單的????
????HMENU hmenuSubMenu;
????LPITEMIDLIST pidl;
????if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, stmenuData[i].nSpecialFolder, &pidl))) {
??? ????hmenuSubMenu = FileMenu_CreatePopupWithPIDL(pidl);//創建彈出的下級菜單
??? ????fOK = AppendMenu(hmenu,? MF_OWNERDRAW | MF_POPUP,
??? ???????? (UINT)hmenuSubMenu,
??? ???????? (LPCTSTR)&stmenuData[i]);
??????????????? }??? ????????
???}
???//-------------------------------------------------------------------------------------------------------*/
???
??}else{
??? //fOK = AppendMenu(hmenu,MF_SEPARATOR, 0,0); //創建一個菜單分割符
??}
??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() */
轉載于:https://www.cnblogs.com/wodeyitian/archive/2006/03/04/2460575.html
總結
以上是生活随笔為你收集整理的WinCE 开始菜单StartMenu_Create()函数代码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 松下SW-9585-C全功能DVD刻录机
- 下一篇: LED适用范围及寿命