ncurses programming howto 书中源代码-3

/*
 * =====================================================================================
 *
 *       Filename:  11.c
 *
 *    Description:  mouse
 *
 *        Version:  1.0
 *        Created:  2010骞�湀21鏃� 14鏃�垎00绉�
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  cdutyangshaokun@163.com
 *        Company:  College of Information Engineering of CDUT
 *
 * =====================================================================================
 */
#include<string.h>
#include<ncurses.h>
#define WIDTH 30
#define HEIGHT 10
int startx=0;
int starty=0;
char *choices[]={
	"choice 1",
	"choice 2",
	"choice 3",
	"choice 4",
	"exit",
};
int n_choices=sizeof(choices)/sizeof(char*);
void print_menu(WINDOW *menu_win,int highlight);
void report_choice(int mouse_x,int mouse_y,int *p_choice);
int main()
{
	int c,choice=0;
	WINDOW *menu_win;
	MEVENT event;
	initscr();
	clear();
	noecho();
	cbreak();
	startx=(80-WIDTH)/2;
	starty=(24-HEIGHT)/2;


	attron(A_REVERSE);
	mvprintw(23,1,"click on exit to quit");
	refresh();
	attroff(A_REVERSE);

	menu_win=newwin(HEIGHT,WIDTH,starty,startx);
	print_menu(menu_win,1);
	mousemask(ALL_MOUSE_EVENTS,NULL);
	while(1)
	{
		c=wgetch(menu_win);
		switch(c)
		{
			case KEY_MOUSE:
			if(getmouse(&event)==OK)
			{
				if(event.bstate&BUTTON1_PRESSED)
				{
					report_choice(event.x+1,event.y+1,&choice);
					if(choice==-1)
						goto end;
					mvprintw(22,1,"choice made is :%d string chosen is /"%10s/"",choice,choices[choice-1]);
					refresh();
				}
			}
			print_menu(menu_win,choice);
			break;
		}
	}
end:
	endwin();
	return 0;
}

void print_menu(WINDOW *menu_win,int highlight)
{
	int x,y,i;
	x=2;
	y=2;
	box(menu_win,0,0);
	for(i=0;i<n_choices;++i)
	{
		if(highlight==i+1)
		{
			wattron(menu_win,A_REVERSE);
			mvwprintw(menu_win,y,x,"%s",choices[i]);
			wattroff(menu_win,A_REVERSE);
			
		}
		else mvwprintw(menu_win,y,x,"%s",choices[i]);
		++y;
	}
	wrefresh(menu_win);
}

void report_choice(int mouse_x,int mouse_y,int *p_choice)
{
	int i,j,choice;
	i=startx+2;
	j=starty+3;
	for(choice=0;choice<n_choices;++choice)
		if(mouse_y==j+choice && mouse_x>=i&&mouse_x<=i+strlen(choices[choice]))
		{
			if(choice==n_choices-1)
				*p_choice=-1;
			else
				*p_choice=choice+1;
			break;
		}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值