📄 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 + -