?? rcmenu.c
字號:
/***************************************************************************** ------------ 子系統名稱: 界面資源管理器* RCMENU.H* ------------ 模塊名稱 : 菜單資源編譯程序****************************************************************************/#include "tools.h"#include "menu.h"#include "rc.h"/***************************************************************************** 函數原型: SetMenuHotKey ( PMENUITEM pmiTemp )** 功 能: 設置菜單熱鍵** 編程人員: Zhu haibin** 編碼時間: 1994/09/07** 修改時間:** 入口參數: char *pText 菜單文本** 出口參數: 總為 OK** 實現算法: 1. 前導字符 '&' 表示的字母為熱鍵, 熱鍵必須為字母或數字** 上層調用: CompileMenu** 下層調用: 無****************************************************************************/short SetMenuHotKey ( PMENUITEM pmiTemp ){ short i; pmiTemp->nHotKeyIndex = -1; for ( i = 0; i < strlen ( pmiTemp->pText ); i++ ) { if ( pmiTemp->pText[i] == '&' ) { if ( isalpha ( pmiTemp->pText[i+1] ) || isdigit ( pmiTemp->pText[i+1] ) ) { pmiTemp->nHotKey = pmiTemp->pText[i+1]; pmiTemp->nHotKeyIndex = i; } else pmiTemp->nHotKeyIndex = -1; strcpy ( &pmiTemp->pText[i], &pmiTemp->pText[i+1] ); break; } } return ( OK );}/***************************************************************************** 函數原型: JustMenuText ( PMENU pmMenu )** 功 能: 調整菜單字符串長度** 編程人員: Zhu haibin** 編碼時間: 1994/09/07** 修改時間:** 入口參數: PMENUITEM pmiTemp 菜單項指針** 出口參數: 總為 OK** 實現算法:** 上層調用: CompileMenu** 下層調用: 無****************************************************************************/short JustMenuText ( PMENU pmMenu ){ PMENUITEM pmiTemp; short i, nLen; char pText[MAXL_MENUITEM]; for ( i = 0; i < pmMenu->nCount; i++ ) { pmiTemp = pmMenu->pmiTable[i]; if ( pmiTemp->pText[0] != ' ' ) { sprintf ( pText, " %s", pmiTemp->pText ); if ( pmiTemp->nHotKeyIndex != -1 ) pmiTemp->nHotKeyIndex ++; } else strcpy ( pText, pmiTemp->pText ); if ( pmiTemp->nParent == -1 ) { if ( pText[strlen(pText)-1] != ' ' ) strcat ( pText, " " ); } else if ( pmiTemp->nStyle != MS_SEPARATOR ) { nLen = HIWORD ( pmMenu->pmiTable[pmiTemp->nParent]->lExtData ); if ( ( nLen % 2 ) != 0 ) { nLen ++; pmMenu->pmiTable[pmiTemp->nParent]->lExtData &= 0xFFFF; pmMenu->pmiTable[pmiTemp->nParent]->lExtData |= (DWORD)nLen << 16; } while ( strlen ( pText ) < nLen ) strcat ( pText, " " ); } else { pText[0] = 0; nLen = HIWORD ( pmMenu->pmiTable[pmiTemp->nParent]->lExtData ); if ( ( nLen % 2 ) != 0 ) nLen ++; while ( (short)strlen ( pText ) < nLen )#ifdef HZD strcat ( pText, TAB_HLINE(LS_STAND) );#else pText[strlen(pText)] = (char*)TAB_HLINE(LS_STAND);#endif } strcpy ( pmiTemp->pText, pText ); } return ( OK );}/***************************************************************************** 函數原型: CompilePopupMenu ( char **ppRESBuf, char *pWord, PMENU pmMenu, short nParent )** 功 能: 編譯彈出菜單** 編程人員: Zhu haibin** 編碼時間: 1994/09/07** 修改時間:** 入口參數: char **ppRESBuf 資源數據緩沖區* char *pWord 單詞緩沖區* PMENU pmMenu 菜單資源指針* PMENUITEM pmiMenuItem 彈出菜單項** 出口參數: =0 編譯成功* <0 編譯失敗** 實現算法:** 上層調用: CompileMenu** 下層調用: GetWord* WordToInt* CheckKeyWord****************************************************************************/short CompilePopupMenu ( char **ppRESBuf, char *pWord, PMENU pmMenu, short nParent ){ PMENUITEM pmiTemp; short nErrorID; short nFirst, nPrev, nAction, nStyle; short nCount, nLen; char pText[MAXL_MENUITEM]; if ( GetWord ( ppRESBuf, pWord ) < OK ) return ( ERR_RES_SYNTAX ); if ( CheckKeyWord ( pWord ) == ID_BREAK ) { if ( nParent < 0 ) return ( ERR_RES_SYNTAX ); pmMenu->nRightBreak = nParent; if ( GetWord ( ppRESBuf, pWord ) < OK ) return ( ERR_RES_SYNTAX ); } if ( CheckKeyWord ( pWord ) != ID_BEGIN ) return ( ERR_RES_SYNTAX ); nFirst = nPrev = -1; nCount = nLen = 0; while ( 1 ) { if ( GetWord ( ppRESBuf, pWord ) < OK ) /* 讀關鍵字 */ return ( ERR_RES_SYNTAX ); nErrorID = CheckKeyWord ( pWord ); if ( nErrorID == ID_END ) /* 關鍵字 END */ break; if ( ( nErrorID != ID_MENUITEM ) && ( nErrorID != ID_POPUP ) ) return ( ERR_RES_SYNTAX ); /* 非法關鍵字 */ if ( GetWord ( ppRESBuf, pWord ) < OK ) /* 讀字符串 */ return ( ERR_RES_SYNTAX ); strcpy ( pText, pWord ); if ( nErrorID == ID_MENUITEM ) /* 讀動作代碼 */ { if ( CheckKeyWord ( pText ) == ID_SEPARATOR ) nStyle = MS_SEPARATOR; else { if ( GetWord ( ppRESBuf, pWord ) < OK ) return ( ERR_RES_SYNTAX ); if ( WordToInt ( &nAction, pWord ) < OK ) return ( ERR_RES_DIGIT ); nStyle = MS_MENUITEM; } } else nStyle = MS_POPMENU; if ( NewMenuItem ( &pmiTemp ) < OK ) /* 創建菜單項 */ return ( ERR_NOMEMORY ); pmMenu->pmiTable[pmMenu->nCount] = pmiTemp; strcpy ( pmiTemp->pText, pText ); SetMenuHotKey ( pmiTemp ); if ( strlen ( pmiTemp->pText ) > nLen ) nLen = strlen ( pmiTemp->pText ); pmiTemp->nPosX = 2; pmiTemp->nPosY = nCount + 1; pmiTemp->nStatus = MS_STANDARD; pmiTemp->nStyle = nStyle; pmiTemp->nAction = nAction; pmiTemp->nParent = nParent; if ( nFirst == -1 ) { nFirst = nPrev = pmMenu->nCount; if ( nParent >=0 ) pmMenu->pmiTable[nParent]->nSub = nFirst; } else { pmiTemp->nPrev = nPrev; pmMenu->pmiTable[nPrev]->nNext = pmMenu->nCount; } nPrev = pmMenu->nCount; pmMenu->nCount ++; nCount ++; if ( nErrorID == ID_POPUP ) { nErrorID = CompilePopupMenu ( ppRESBuf, pWord, pmMenu, nPrev ); if ( nErrorID < OK ) return ( nErrorID ); } } if ( nCount > 0 ) { pmiTemp->nNext = nFirst; pmMenu->pmiTable[nFirst]->nPrev = nPrev; } if ( nParent >= 0 ) pmMenu->pmiTable[nParent]->lExtData = nCount + ( (DWORD)(nLen+2) << 16 ); return ( OK );}/***************************************************************************** 函數原型: CompileMenu ( char **ppRESBuf, char *pWord, void **ppmMenu )** 功 能: 編譯菜單資源** 編程人員: Zhu haibin** 編碼時間: 1994/09/07** 修改時間:** 入口參數: char **ppRESBuf 資源數據緩沖區* char *pWord 單詞緩沖區** 出口參數: >0 編譯成功 本菜單資源標識號* ppmMenu 為菜單指針* <0 編譯失敗** 實現算法:** 上層調用: CompileResource** 下層調用: GetWord* WordToInt* CompilePopupMenu****************************************************************************/short CompileMenu ( char **ppRESBuf, char *pWord, void **ppmMenu ){ PMENU pmMenu; short nErrorID; short nMenuID; short ch; /* 取菜單資源標識號 */ if ( GetWord ( ppRESBuf, pWord ) < OK ) return ( ERR_RES_SYNTAX ); if ( WordToInt ( &nMenuID, pWord ) < OK ) return ( ERR_RES_DIGIT ); /* 創建菜單資源 */ if ( NewMenu ( &pmMenu ) < OK ) return ( ERR_NOMEMORY ); pmMenu->nCount = 0; nErrorID = CompilePopupMenu ( ppRESBuf, pWord, pmMenu, -1 ); if ( nErrorID < OK ) return ( nErrorID ); pmMenu->pmiHead = pmMenu->pmiTable[0]; JustMenuText ( pmMenu ); *ppmMenu = (void*)pmMenu; return ( nMenuID );}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -