所谓光条式菜单,就是类似你装有多操作系统时,开机时系统让你选择进入哪个操作系统时所用的菜单,不知道正式的名称是不是这个,反正各位看下面的效果图应该就知道我说的是哪种菜单了
怎么样,是不是很炫?其实利用windows编程的知识,C语言可以实现很多很炫的界面。
首先声明以下的实现代码不是我写的,是我先前想实现这种效果而在网上苦寻良久才在某个问答平台上找到的,在此
向原作者表示致敬,同时为了不让如此珍贵的资源埋没在网络的汪洋大海之中,特将此代码记下来,以备后用,
同时供有需要的人参考。
若原作者看到此博文,请与本人联系。
以下是原作者的实现思路,我原封不动地摘录下来
----------------------------------------------------------------------------------------
控制台的设置函数名很多都以 SetConsole 或 GetConsole 开头。
BOOL WINAPI SetConsoleTextAttribute(
__in HANDLE hConsoleOutput,
__in WORD wAttributes
);
第一个参数可用 GetStdHandle(STD_OUTPUT_HANDLE); 获得;
第二个参数意义如下:
Attribute Meaning
FOREGROUND_BLUE Text color contains blue.
FOREGROUND_GREEN Text color contains green.
FOREGROUND_RED Text color contains red.
FOREGROUND_INTENSITY Text color is intensified.
BACKGROUND_BLUE Background color contains blue.
BACKGROUND_GREEN Background color contains green.
BACKGROUND_RED Background color contains red.
BACKGROUND_INTENSITY Background color is intensified.
COMMON_LVB_LEADING_BYTE Leading byte.
COMMON_LVB_TRAILING_BYTE Trailing byte.
COMMON_LVB_GRID_HORIZONTAL Top horizontal.
COMMON_LVB_GRID_LVERTICAL Left vertical.
COMMON_LVB_GRID_RVERTICAL Right vertical.
COMMON_LVB_REVERSE_VIDEO Reverse foreground and background attributes.
COMMON_LVB_UNDERSCORE Underscore.
这些是一个16位数的各个二进制位,你可以用位运算将这些属性组合,如:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY | BACKGROUND_INTENSITY);
如果要不等待回车立刻读入键盘输入,在conio.h中有个getch()函数。
如果要处理上下左右等键盘输入,有个MapVirtualKey函数,可以上网查一下这个函数的具体用法。
如果要清屏,可以发送命令system("cls");,这个函数在stdlib.h中。
实现代码:
#include <stdio.h>
#include <conio.h> //getch()
#include <stdlib.h> //system()
#include <Windows.h> //WIN API
int main(){
//这里只有4个选项,如果选项数更改,后面相应部位也要更改
char*option[]={"option 1","option 2","option 3","option 4"};
char key = 0;
int i, select = 0;
HANDLE ohandle = GetStdHandle(STD_OUTPUT_HANDLE);
while(true){
for(i=0;i<4;i++){//这里共4个选项
if(i==select)//设置焦点高亮
SetConsoleTextAttribute(ohandle,BACKGROUND_INTENSITY);
else if(i==select+1)//恢复设置
SetConsoleTextAttribute(ohandle,FOREGROUND_INTENSITY);
puts(option[i]);
}
SetConsoleTextAttribute(ohandle,FOREGROUND_INTENSITY);//恢复设置
key=getch();
if(key==0x1b) //ESC 键
return 0;
if(key==0xd) //Enter 键
break;
if(key<0){ //非ascii码键2个字节
key=getch();
switch(MapVirtualKey(key,1)){
case VK_UP:
select = (select+3)%4;//焦点上移,减一,滚动选择,共4个选项
break;
case VK_DOWN:
select = (select+1)%4;//焦点下移,加一
break;
}
}
system("cls");
}
system("cls");
//TODO:use select to do something here !
printf("you selected : %s\n",option[select]);
//return 0; //not necessary in new standards
}
也可以用GetKeyState等函数,它返回上一次按键的信息,这些函数属于win API(#include<windows.h>),并可以处理更多按键消息,如需要可查阅msdn。
----------------------------------------------------------------------------------------------------------------------------
上面的效果图中,若选择了一项,则显示相应的结果
读者可根据自身需要对代码作相应的修改。