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

📄 submenu.cpp

📁 C++写的POS前台程序
💻 CPP
字号:
/*******************************************************************************
	模  块:	子菜单条.
	功  能:	能用光标移动选择菜单项并返回菜单号.
	程序员:	雷中南.
	版  本:	v1.1
	时  间:	1999-05-10
*******************************************************************************/
#include <graphics.h>
#include <string.h>
#include "submenu.h"
#include "han.h"
//构造函数.
SubMenu::SubMenu(char *item[], int eventid[], struct RECT R, int Number)
		 : Object(R)
{
	SetBkColor(7);
	han.Color = 0;
	for(int i=0; i<Number; i++)
	{
		//此处由于菜单字符串属于常量所以直接传递指针,而未采用拷贝方式.
		MenuItem[i]=item[i];

		//事件id,意思是菜单被选中后返回的事件代码.
		EventID[i]=eventid[i];
	}

	//表示子菜单的项目数.
	MenuItemNumber=Number;

	//子菜单的光标所在位置(现在表示第一个).
	MenuItemFocus=0;

	//显示子菜单.
	Show();
}

//析构函数.
SubMenu::~SubMenu()
{
}

//重画函数.
void
SubMenu::Draw()
{
	//基类对象重画.
	Object::Draw();
	//画外3d边框.
	setcolor(15);
	line(0, 0, Rect.Width, 0);
	line(0, 0, 0, Rect.Height);
	line(1, Rect.Height-1, Rect.Width-1, Rect.Height-1);
	line(Rect.Width-1, 1, Rect.Width-1, Rect.Height-1);
	setcolor(8);
	line(1, 1, Rect.Width-2, 1);
	line(1, 1, 1, Rect.Height-2);
	line(0, Rect.Height, Rect.Width, Rect.Height);
	line(Rect.Width, 0, Rect.Width, Rect.Height);
	//显示文本标题.
	ItemDraw();
}

//运行子菜单.
void
SubMenu::DoIt()
{
	//重画第一个焦点.
	FocusDraw();
	int Key;
	for(;;)
	{
		//接收键盘.GetKey参见Def.CPP
		Key = GetKey();
		switch( Key )
		{
			case KEY_DOWN:
				//下箭头.
				if(MenuItemNumber > 0)
				{
					//如果菜单不是最后一项.
					if(MenuItemFocus < MenuItemNumber-1)
					{
						//擦除原来焦点.
						FocusRestore();

						//将焦点移到下一项.
						MenuItemFocus++;

						//画出焦点.
						FocusDraw();
					}
					else//如果菜单是最后一项.
					{
						//擦除原来焦点.
						FocusRestore();

						//将焦点移到子菜单第一项.
						MenuItemFocus = 0;

						//重画焦点.
						FocusDraw();
					}
				}
				break;
			case KEY_UP:
				//上箭头.
				if(MenuItemNumber>0)
				{
					//如果光标不是第一项.
					if(MenuItemFocus>0)
					{
						//擦除原来焦点.
						FocusRestore();

						//光标上移.
						MenuItemFocus--;

						//画出焦点.
						FocusDraw();
					}
					else
					{
						//擦除原来焦点.
						FocusRestore();

						//光标移动到最后一项.
						MenuItemFocus = MenuItemNumber-1;

						//画出焦点.
						FocusDraw();
					}
				}
			break;
			case KEY_LEFT:
				//左箭头.
				//向队列中插入请求前一个子菜单的事件.
				PutEvent(MN_PREVSUBMENU);
				return;
			case KEY_RIGHT:
				//右箭头.
				//向队列中插入请求下一个子菜单的事件.
				PutEvent(MN_NEXTSUBMENU);
				return;
			case KEY_RETURN:
				//回车键.
				//调用菜单.
				PutEvent( EventID[MenuItemFocus] );
				return;
			case KEY_ESC:
				//ESC键
				PutEvent(EV_QUIT);
				return;
		}
	}
}

//写菜单项汉字
void
SubMenu::ItemDraw()
{
	int Top = 6;
	for(int i=0; i<MenuItemNumber; i++)
	{
		han.Out(12, Top,MenuItem[i]);
		Top = Top + 24;
	}
}

//画焦点项.
void
SubMenu::FocusDraw()
{
	//画蓝条.
	setfillstyle(SOLID_FILL,1);
	bar(3, MenuItemFocus * 24 + 3, Rect.Width-3, MenuItemFocus * 24 + 25);
	//画3d边框.
	setcolor(15);
	line(3, MenuItemFocus * 24 + 3, 3, MenuItemFocus * 24 + 25);
	line(3, MenuItemFocus * 24 + 3, Rect.Width-3, MenuItemFocus * 24 + 3);
	setcolor(8);
	line(3, MenuItemFocus * 24 + 25, Rect.Width-3, MenuItemFocus * 24 + 25);
	line(Rect.Width-3, MenuItemFocus * 24 + 3,
												Rect.Width-3, MenuItemFocus * 24 + 25);
	//写白色汉字菜单项.
	int temp = han.Color;
	han.Color=15;
	han.Out(12, MenuItemFocus * 24 + 6, MenuItem[MenuItemFocus]);
	han.Color=temp;
}

//隐藏焦点项.
void
SubMenu::FocusRestore()
{
	//画背景色方框.
	setfillstyle(SOLID_FILL,BackColor);
	bar(3, MenuItemFocus * 24 + 3, Rect.Width-3, MenuItemFocus * 24 + 25);
	han.Color = 0;
	//写黑色汉字.
	han.Out(12, MenuItemFocus * 24 + 6, MenuItem[MenuItemFocus]);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -