📄 uimenu.c
字号:
/*********************************************************************/
// 文 件 名: uiMenu.cpp
// 程序说明: 菜单
// 程序设计: 张学平
// 2001.10.23 设计完成 说明文档:R004-S234-0001
// 程序审查: 宋军霞
// 2002.01.28 审查完成 说明文档:R004-S234-0001
// 项目编号: R004-S234
// 版 本: V1.0
// 版 权: Reality Plus Technology (ShenZhen) Co.,Ltd.
/*********************************************************************/
#include <pr2k.h>
#include <string.h>
#include <uiMenu.h>
#include <uiWnd.h>
#include <uiGraph.h>
#include <uiSound.h>
extern int gLanguage;
BYTE *gpMenuBuffer=NULL; // 弹出菜单时保存屏幕背景
HNDL ghPopupMenu=NULL; // 当前活动菜单
/****************************************************************
// 创建菜单
// 参数:
// left,top 菜单标题左上角座标
// caption 菜单标题
// style 风格,暂时没有使用
// 返回值:
// 成功 菜单句柄
// 失败 NULL
*****************************************************************/
DLL_EXP(HNDL) guiMenu_Create(short left,short top,short right,short bottom,const char* caption,WORD style)
{
TGuiMenu *pMenu;
WORD tStyle;
guiEnterWCS();
pMenu = (TGuiMenu *)kernelMalloc(sizeof(TGuiMenu));
if( !pMenu )
{
guiExitWCS();
return NULL; // 空间不够
}
pMenu->base.handle=(HNDL)pMenu; // 基本参数
pMenu->base.type = CONTROL_MENU;
pMenu->base.left=left;
pMenu->base.top=top;
pMenu->base.right=right;
pMenu->base.bottom=bottom;
pMenu->base.checkFlag = GUI_CONTROL_CHECK_FLAG; //9296
pMenu->base.style=style; // 暂时未用
pMenu->base.status = CONTROL_ACTIVE;
pMenu->base.font = GUI_DEFAULT_FONT;
pMenu->base.vportHandle=NULL;
pMenu->base.container=NULL;
pMenu->base.actionFun = (PF_ACTION )_guiMenu_Action; // 回调函数
pMenu->base.showFun = (PF_SHOW)_guiMenu_Show;
pMenu->base.delFun = (PF_DELETE)_guiMenu_Delete;
pMenu->popupFlag = MENU_SHRINK; // 没有展开
pMenu->activeItem = -1; // 没有选中项
tStyle=style&MENU_TYPEMASK;
if( tStyle==MENU_SYSTEM || tStyle==MENU_TITLE ) // 系统或标题条上的菜单
{
pMenu->color=GUI_WHITE; // 前景为白色
pMenu->backColor=GUI_BLACK; // 背景为黑色
}
else // 其它地方的菜单
{
pMenu->color=GUI_BLACK; // 前景为黑色
pMenu->backColor=GUI_WHITE; // 背景为白色
}
pMenu->countItem=0; // 菜单项数为0
pMenu->popup_left = 0; // 展开时的座标
pMenu->popup_top = 0;
pMenu->popup_right = 0;
pMenu->popup_bottom = 0;
if(caption) // 标题
{
strncpy(pMenu->caption, caption, GUI_MENU_CAPTION_SIZE);
pMenu->caption[GUI_MENU_CAPTION_SIZE]=0;
}
else
pMenu->caption[0]=0;
pMenu->pMenuList = NULL; // 没有菜单项
guiExitWCS();
return (HNDL)pMenu;
}
/****************************************************************
// 添加一个菜单项
// 参数:
// hMenu 菜单句柄
// szItem 菜单项内容
// nCommand 命令字
// 返回值:
// 成功 STATUS_OK
// 失败 STATUS_ERR
*****************************************************************/
DLL_EXP(STATUS) guiMenu_AppendItem(HNDL hMenu, const char *szItem, short nCommand)
{
TGuiMenu *pMenu;
TMenuItem *pMenuItem, *pCurNode, *pPreNode;
int itemCount = 0;
if(!szItem)
return STATUS_ERR; // 菜单项无效
guiEnterWCS();
pMenu =(TGuiMenu *)hMenu;
if(pMenu->base.checkFlag != GUI_CONTROL_CHECK_FLAG)
{
guiExitWCS();
return STATUS_ERR; // 菜单无效
}
if(pMenu->countItem >= MAX_MENUITEM_COUNT)
{
guiExitWCS();
return STATUS_ERR; // 菜单项数已满
}
pMenuItem = (TMenuItem *)kernelMalloc(sizeof(TMenuItem));
if( !pMenuItem )
{
guiExitWCS();
return STATUS_ERR; // 空间不够
}
strncpy((char *)pMenuItem->caption, szItem, GUI_MENU_ITEM_SIZE); // 初始化数据
pMenuItem->caption[GUI_MENU_ITEM_SIZE]=0;
pMenuItem->command = nCommand;
pMenuItem->check = 0;
pMenuItem->next = NULL;
if(!(pMenu->pMenuList)) // 第一个菜单项
{
pMenu->pMenuList = pMenuItem;
pMenu->countItem++;
guiExitWCS();
return STATUS_OK;
}
pPreNode = pMenu->pMenuList;
pCurNode = pPreNode->next;
while(pCurNode) // 定位到最后一项
{
pPreNode = pCurNode;
pCurNode = pPreNode->next;
}
pPreNode->next = pMenuItem; // 添加节点
pMenu->countItem++;
guiExitWCS();
return STATUS_OK;
}
/****************************************************************
// 插入一个菜单项
// 参数:
// hMenu 菜单句柄
// szItem 菜单项内容
// nCommand 命令字
// nPos 插入后成为第几项
// 返回值:
// 成功 STATUS_OK
// 失败 STATUS_ERR
*****************************************************************/
DLL_EXP(STATUS) guiMenu_InsertItem(HNDL hMenu,const char *szItem, short nCommand, short nPos)
{
TGuiMenu *pMenu;
TMenuItem *pMenuItem, *pCurNode, *pPreNode;
short i;
if(!szItem)
return STATUS_ERR; // 菜单项无效
guiEnterWCS();
pMenu =(TGuiMenu *)hMenu;
if(pMenu->base.checkFlag != GUI_CONTROL_CHECK_FLAG)
{
guiExitWCS();
return STATUS_ERR; // 菜单无效
}
if(pMenu->countItem >= MAX_MENUITEM_COUNT)
{
guiExitWCS();
return STATUS_ERR; // 菜单项数已满
}
pMenuItem = (TMenuItem *)kernelMalloc(sizeof(TMenuItem));
if( !pMenuItem )
{
guiExitWCS();
return STATUS_ERR; // 空间不够
}
strncpy((char *)pMenuItem->caption, szItem, GUI_MENU_ITEM_SIZE); // 初始化参数
pMenuItem->caption[GUI_MENU_ITEM_SIZE]=0;
pMenuItem->command = nCommand;
pMenuItem->check = 0;
pMenuItem->next = NULL;
if(!(pMenu->pMenuList)) // 原来没有菜单项
{
pMenu->pMenuList = pMenuItem;
pMenu->countItem++;
guiExitWCS();
return STATUS_OK;
}
if( !nPos ) // 插入后为菜单第0项
{
pMenuItem->next=pMenu->pMenuList;
pMenu->pMenuList=pMenuItem;
pMenu->countItem++;
guiExitWCS();
return STATUS_OK;
}
i=0;
nPos--;
pPreNode = pMenu->pMenuList;
pCurNode = pPreNode->next;
while(pCurNode)
{
if(i==nPos)
break;
i++;
pPreNode = pCurNode;
pCurNode = pPreNode->next;
}
pPreNode->next=pMenuItem;
pMenuItem->next=pCurNode;
pMenu->countItem++;
guiExitWCS();
return STATUS_OK;
}
/****************************************************************
// 删除一个菜单项
// 参数:
// hMenu 菜单句柄
// nPos 删除的位置
// 返回值:
// 成功 STATUS_OK
// 失败 STATUS_ERR
*****************************************************************/
DLL_EXP(STATUS) guiMenu_DeleteItem(HNDL hMenu, short nPos)
{
TGuiMenu *pMenu;
TMenuItem *pCurNode, *pPreNode;
int i=0;
guiEnterWCS();
pMenu =(TGuiMenu *)hMenu;
if(pMenu->base.checkFlag != GUI_CONTROL_CHECK_FLAG)
{
guiExitWCS();
return STATUS_ERR; // 菜单无效
}
if(nPos>=pMenu->countItem)
{
guiExitWCS();
return STATUS_ERR; // 没有要删除的菜单项
}
pPreNode = pMenu->pMenuList;
pCurNode = pPreNode->next;
if( !nPos ) // 删除第一项
{
pMenu->pMenuList = pCurNode;
pMenu->countItem--;
kernelFree(pPreNode);
guiExitWCS();
return STATUS_OK;
}
nPos--;
while(i!=nPos)
{
pPreNode = pCurNode;
pCurNode = pPreNode->next;
i++;
}
if(pCurNode)
pPreNode->next=pCurNode->next;
else
pPreNode->next=NULL;
pMenu->countItem--;
kernelFree(pCurNode);
guiExitWCS();
return STATUS_OK;
}
/****************************************************************
// 展开菜单
// 参数:
// hMenu 菜单句柄
// 返回值:
// 成功 STATUS_OK
// 失败 STATUS_ERR
*****************************************************************/
DLL_EXP(STATUS) guiMenu_Popup(HNDL hMenu)
{
TMenuItem *pMenuList;
TGuiMenu *pMenu;
short itemHeight,itemWidth,tWidth,menuHeight,menuWidth;
short left,top,right,bottom;
BYTE *pBuffer;
int i=0;
guiEnterWCS();
pMenu = (TGuiMenu *)hMenu;
if(pMenu->base.checkFlag != GUI_CONTROL_CHECK_FLAG)
{
guiExitWCS();
return STATUS_ERR; // 菜单无效
}
pMenuList = pMenu->pMenuList;
if( !pMenuList )
{
guiExitWCS();
return STATUS_ERR; // 没有菜单项
}
if(pMenu->base.container!=(HNDL)gpTopWindow)
{
guiExitWCS();
return STATUS_ERR; // 菜单所属窗口不是顶层窗口
}
guiPushFont(pMenu->base.font);
itemHeight = guiGetStringHeight()+MENUITEM_HEIGHT_GAP; // 第个菜单项高度
itemWidth=50; // 菜单最小宽度
while(pMenuList)
{
tWidth=guiGetStringWidth(pMenuList->caption);
if(tWidth>itemWidth)
itemWidth=tWidth;
pMenuList = pMenuList->next;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -