LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 750|回复: 2

请教curses下用box或subwin画小框框的问题

[复制链接]
发表于 2004-7-4 01:28:33 | 显示全部楼层 |阅读模式
我想画一个类似于"田"字的22*15网格,希望网格中的小格子有一定的颜色并且可以移动到别的位置覆盖掉这个位置上的格子,我的方法如下:
high=30;width=88;
win=newwin(high+1,width,LINES/2-18,COLS/2-44);

frame_win=derwin(win,2,4,0,0);
//frame_win来标志某一个格子,处在左上角
wbkgd(frame_win,COLOR_PAIR(3));
wbkgd(win,COLOR_PAIR(2));
box(frame_win,ACS_VLINE,ACS_HLINE);
box(win,ACS_VLINE,ACS_HLINE);
for(i=0;i<high/2;i++)
{
mvwaddch(_win,2*(i+1),0,ACS_LTEE);
mvwaddch(win,2*(i+1),width-1,ACS_RTEE);
};
for(i=1;i<high;i++)
for(j=0;j<width-2;j++)
mvwaddch(win,2*i,j+1,ACS_HLINE);
for(j=1;j<width/2+1;j++)
for(i=0;i<high;i++)
mvwaddch(win,i,4*j,ACS_VLINE);
for(i=0;i<width/4;i++)
{
mvwaddch(win,0,4*(i+1),ACS_TTEE);
mvwaddch(win,high,4*(i+1),ACS_BTEE);
};
此方法可以画好22*15个格子,但左上角的小格子边界始终无法对齐格子边沿,请问如何实现啊.

我用另外一种方法生成22*15个SUBWIN,然后每个subwin用 box(box_win,ACS_VLINE,ACS_HLINE);格子加线的尺寸比实际窗口的要小,造成格子之间的分界线无法重合.请大家指点指点,谢了先!
发表于 2004-7-8 18:47:32 | 显示全部楼层

以下程序可否输入中文?

#include <form.h>
#include <locale.h>

int main()
{ FIELD *field[3];
FORM *my_form;
int ch;

setlocale( LC_CTYPE, "" );

/* Initialize curses */
initscr();
cbreak();
noecho();
keypad(stdscr, TRUE);
meta( stdscr,TRUE );

/* Initialize the fields */
field[0] = new_field(1, 10, 4, 18, 0, 0);
field[1] = new_field(1, 10, 6, 18, 0, 0);
field[2] = NULL;

/* Set field options */
set_field_back(field[0], A_UNDERLINE); /* Print a line for the option */
field_opts_off(field[0], O_AUTOSKIP); /* Don't go to next field when this */
/* Field is filled up */
set_field_back(field[1], A_UNDERLINE);
field_opts_off(field[1], O_AUTOSKIP);

/* Create the form and post it */
my_form = new_form(field);
post_form(my_form);
refresh();

mvprintw(4, 10, "Value 1:");
mvprintw(6, 10, "Value 2:");
refresh();

/* Loop through to get user requests */
while((ch = getch()) != KEY_F(1))
{ switch(ch)
{ case KEY_DOWN:
/* Go to next field */
form_driver(my_form, REQ_NEXT_FIELD);
/* Go to the end of the present buffer */
/* Leaves nicely at the last character */
form_driver(my_form, REQ_END_LINE);
break;
case KEY_UP:
/* Go to previous field */
form_driver(my_form, REQ_PREV_FIELD);
form_driver(my_form, REQ_END_LINE);
break;
default:
/* If this is a normal character, it gets */
/* Printed */
form_driver(my_form, ch);
break;
}
}

/* Un post form and free the memory */
unpost_form(my_form);
free_form(my_form);
free_field(field[0]);
free_field(field[1]);

endwin();
return 0;
}
 楼主| 发表于 2004-7-9 14:06:50 | 显示全部楼层
不能输入
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表