⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uimenu.c

📁 嵌入工linux开发的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************/
//	文 件 名:	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 + -