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