精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>unix,linux,free bsd>>一个unix下course的样例程序

主题:一个unix下course的样例程序
发信人: supermario()
整理人: wenbobo(2002-12-27 15:59:28), 站内信件
以前写的一个测试程序,由于没有时间,没法写完,
缺少键盘处理,而且注意不同的unix版本下curses
库的函数调用与参数可能会不同。
#include <stdio.h>
#include <curses.h>
#include <termio.h>
#define MMAX 6
#define SMAX 6

char *mstr[MMAX];
WINDOW *win,*swin;

struct submenu{
int size;
char *ss[SMAX];
int wide;
}under[MMAX];

int locate,lo;
int choice;
main(){
int r0,i,j;
int sch;

mstr[0] = "File";
mstr[1] = "Edit";
mstr[2] = "Search";
mstr[3] = "Option";
mstr[4] = "Help";
mstr[5] = "Exit";

under[0].size = 6;
under[0].wide = 10;
under[0].ss[0] = "New";
under[0].ss[1] = "Open";
under[0].ss[2] = "Save";
under[0].ss[3] = "Save As";
under[0].ss[4] = "Print";
under[0].ss[5] = "Exit";

under[1].size = 5;
under[1].wide = 8;
under[1].ss[0] = "Cut";
under[1].ss[1] = "Copy";
under[1].ss[2] = "Paste";
under[1].ss[3] = "Clear";
under[1].ss[4] = "Exit";

under[2].size = 4;
under[2].wide = 18;
under[2].ss[0] = "Find";
under[2].ss[1] = "Repeat Last Find";
under[2].ss[2] = "Change";
under[2].ss[3] = "Exit";

under[3].size = 3;
under[3].wide = 12;
under[3].ss[0] = "Display";
under[3].ss[1] = "Help Path";
under[3].ss[2] = "Exit";

under[4].size = 3;
under[4].wide = 16;
under[4].ss[0] = "Getting Started";
under[4].ss[1] = "Keyboard";
under[4].ss[2] = "About...";
under[4].ss[3] = "Exit";

under[5].size = 0;
under[5].wide = 0;

initscr();
savetty();
clear();
refresh();

win = newwin(3,78,0,1);
boo(win);
lo = 0;
locate = drawmain(win,mstr);
while(lo != (MMAX - 1))
{
touchwin(win);
i = under[lo].size + 2;
j = under[lo].wide + 2;
if(locate == ((locate / 2) * 2))
locate++;
swin = newwin(i,j,(* win)._begy + (* win)._maxy - 1,locate -2);
sboo(swin);
sch = drawsub(swin);
werase(swin);
wrefresh(swin);
if(sch != 100)
locate = drawmain(win);
else
{
boo(win);
locate = getl(win);
}
}

endwin(win);
clear();
refresh();
resetty();
endwin();
}

boo(win)
WINDOW *win;
{
int i,j;
int w,h,x,y;

x = 0;
y = 0;
h = (*win)._maxy - 2;
w = (*win)._maxx / 2 - 4;
mvwaddstr(win,x,y," ");
mvwaddstr(win,x,y + w *2 + 2," ");
wrefresh(win);
for(i = 0;i < w;i++)
mvwaddstr(win,x,y + i * 2 + 2,"-");
wrefresh(win);
for(i = 1;i <= h;i++)
{
mvwaddstr(win,x + i,y,"|");
mvwaddstr(win,x + i,y + w * 2 + 2,"|");
}
wrefresh(win);
mvwaddstr(win,x + h + 1,y," ");
mvwaddstr(win,x + h + 1,y + 2 + w * 2," ");
wrefresh(win);
for(i = 0;i < w;i++)
mvwaddstr(win,x + h + 1,y + 2 * i + 2,"-");
wrefresh(win);
}

int drawmain(win)
WINDOW *win;
{
int i,j,n,size;
struct{
int lx,ly;
char *s;
}ss[MMAX];

int inter;

size = MMAX;
wstandend(win);
i = 0;
for(j = 0;j < size;j++)
i = i + strlen(mstr[j]);
inter = ((* win)._maxx - i) / (size +1);
j = inter;
for(i = 0;i < size;i++)
{
ss[i].ly = 1;
ss[i].lx = j;
ss[i].s = mstr[i];
mvwaddstr(win,1,j,mstr[i]);
wrefresh(win);
j = j + inter + strlen(mstr[i]);
}

wstandout(win);

mvwaddstr(win,ss[lo].ly,ss[lo].lx,ss[lo].s);
wrefresh(win);
noecho();
i = mgetch();
while((i != 10)&&(i != 50))
{

switch(i){
case 54:
wstandend(win);
mvwaddstr(win,ss[lo].ly,ss[lo].lx,ss[lo].s);
wrefresh(win);
if(lo == size - 1)
lo = 0;
else
lo = lo + 1;

wstandout(win);

mvwaddstr(win,ss[lo].ly,ss[lo].lx,ss[lo].s);
wrefresh(win);
break;

case 52:
wstandend(win);
mvwaddstr(win,ss[lo].ly,ss[lo].lx,ss[lo].s);
wrefresh(win);
if(lo == 0)
lo = size - 1;
else
lo = lo -1;

wstandout(win);
mvwaddstr(win,ss[lo].ly,ss[lo].lx,ss[lo].s);
wrefresh(win);
break;
}
i = mgetch();
}
wstandend(win);
mvwaddstr(win,ss[lo].ly,ss[lo].lx,ss[lo].s);
wrefresh(win);
return(ss[lo].lx);
}

int drawsub(win)
WINDOW *win;
{
int i,j,n;
int k0;
int re;
wstandend(win);
touchwin(win);
for(i = 0;i < under[lo].size;i++)
mvwaddstr(win,1 + i,2,under[lo].ss[i]);
wrefresh(win);
k0 = 0;

wstandout(win);
mvwaddstr(win,1,2,under[lo].ss[k0]);
wrefresh(win);
noecho();
re = 200;
printf("I = %d\n",i);
while(i != 10)
{
switch(i){
case 52:
if(lo = 0)
lo = MMAX -1;
else
lo--;
re = 100;
break;
case 54:
if(lo == (MMAX - 1))
lo = 0;
else
lo++;
re = 100;
break;
case 56:
wstandend(win);
mvwaddstr(win,1 + k0,2,under[lo].ss[k0]);
wrefresh(win);
if(k0 == 0)
k0 = under[lo].size - 1;
else
k0--;

wstandout(win);
mvwaddstr(win,1 + k0,2,under[lo].ss[k0]);
wrefresh(win);
re = k0;
break;
case 50:
wstandend(win);
mvwaddstr(win,1 + k0,2,under[lo].ss[k0]);
wrefresh(win);
if(k0 == (under[lo].size - 1))
k0 = 0;
else
k0++;

wstandout(win);
mvwaddstr(win,1 + k0,2,under[lo].ss[k0]);
wrefresh(win);

re = k0;
break;
}
if(re == 100)
break;
i = mgetch();
}
return(re);
}

int mgetch()
{
struct termio tdes,old;
int i;
char c;

ioctl(0,TCGETA,&tdes);
ioctl(0,TCGETA,&old);
tdes.c_lflag &= ~ICANON;
tdes.c_cc[VMIN] = 1;
tdes.c_cc[VTIME] = 0;
ioctl(0,TCSETA,&tdes);
i = read(0,&c,1);
if(c != 27)
goto end;
read(0,&c,1);
read(0,&c,1);
switch(c){
case 'A':
return(56);
break;
case 'B':
return(50);
break;
case 'C':
return(54);
break;
case 'D':
return(52);
break;
}
end:
ioctl(0,TCSETA,&old);
return(c);
}

sboo(win)
WINDOW *win;
{
int i,j;
int w,h;
int x,y;

x = 0;
y = 0;
w = (* win)._maxx - 2;
h = (* win)._maxy -1;
mvwaddstr(win,x,y,"T");
mvwaddstr(win,x,y + w,"T");
wrefresh(win);
for(i = 2;i < w;i = i + 2)
mvwaddstr(win,x,y + i,"-");
wrefresh(win);
for(i = 1;i < h;i++)
{
mvwaddstr(win,x + i,y,"|");
mvwaddstr(win,x + i,y + w,"|");
}
wrefresh(win);
mvwaddstr(win,x + h,y," ");
mvwaddstr(win,x + h,y + w," ");
wrefresh(win);
for(i = 2;i < w;i = i + 2)
mvwaddstr(win,x + h,y + i,"-");
wrefresh(win);
}

int getl(win)
WINDOW *win;
{
int i,j,n,size;
int inter;

size = MMAX;
i = 0;
for(j = 0;j < size;j++)
i = i + strlen(mstr[j]);
inter = ((* win)._maxx - i) / (size + 1);
j = inter;
for(i = 0;i < lo;i++)
j = j + inter + strlen(mstr[i]);
return(j);
}

--
点解,点解啊?!!(摧胸顿足状)

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.102.171.26]
发信人: luckydog (Lucky), 信区: CLanguage
标  题: Re: 一个unix下curses的样例(缺键盘处理)
发信站: 网易虚拟社区 (Thu Oct 28 00:02:24 1999), 站内信件

【 在 supermario (Mario) 的大作中提到: 】
: 以前写的一个测试程序,由于没有时间,没法写完,
: 缺少键盘处理,而且注意不同的unix版本下curses
: 库的函数调用与参数可能会不同。
: #include <stdio.h>
:    .......
为什么不用wgetch()、halfdelay()或nodelay()?

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.184.55]
发信人: supermario (Mario), 信区: CLanguage
标  题: Re: 一个unix下curses的样例(缺键盘处理)
发信站: 网易虚拟社区 (Thu Oct 28 09:22:31 1999), 站内信件

【 在 luckydog (Lucky) 的大作中提到: 】
: 【 在 supermario (Mario) 的大作中提到: 】
: : 以前写的一个测试程序,由于没有时间,没法写完,
: : 缺少键盘处理,而且注意不同的unix版本下curses
: : 库的函数调用与参数可能会不同。
:    .......
这只是一个半成品,我还没有时间去完成它,各种unix下的
curses库函数都不同,如果你有更好的请与我联系。

--
点解,点解啊?!!(摧胸顿足状)

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.102.171.14]
发信人: luckydog (Lucky), 信区: CLanguage
标  题: Re: 一个unix下curses的样例(缺键盘处理)
发信站: 网易虚拟社区 (Thu Oct 28 23:37:56 1999), 站内信件

【 在 supermario (Mario) 的大作中提到: 】
: 【 在 luckydog (Lucky) 的大作中提到: 】
: : 【 在 supermario (Mario) 的大作中提到: 】
: :    .......
: 这只是一个半成品,我还没有时间去完成它,各种unix下的
:    .......

我曾在几个UNIX平台上实现过。
(PC上的SCO,IBM RS/6000的AIX, NCR, HP, SUN, TANDEM上编译通过并运行良好
)


#define NO_KEY_IN   -1

Init_Screen()
{
    ...

    initscr();
    noecho();
    raw();

    ...

    /* **************************************** */
    /* 设定键盘输入方式,每个按键只返回一个键值 */
    /* **************************************** */
    keypad( stdscr , TRUE );

    /* ************************************* */
    /* 设定键盘输入函数的超时时间,1:1/10秒 */
    /*                             2:2/10秒 */
    /*                             ...       */
    /* nodelay() 为无等待                    */
    /* ************************************* */
    halfdelay( 1 );

    ...
}

GetCmd()
{
    int iKey;
    ...

    iKey = wgetch( stdscr );
    if ( iKey != NO_KEY_IN )
    {
        /* ******************************* */
        /* 当iKey不为NO_KEY_IN时,返回键值 */
        /* ******************************* */
        ...
    }
    else
    {
        /* ******** */
        /* 没有按键 */
        /* ******** */
        ...
    }
}

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.184.55]

[关闭][返回]