我正在努力理解ncurses
是如何工作的。这里有一个例子,我正在努力理解并使它工作。
第一个想法:
- 窗口1(
stdscr
),带背景和打印文本 - 背景不同的窗口2(
sWin
)覆盖窗口1 - 将窗口2移到窗口1上
这里是设置:
stdscr, _ := gc.Init()
defer gc.End()
gc.Echo(false)
gc.Cursor(0)
gc.CBreak(true)
stdscr.SetBackground('#')
stdscr.MovePrint(12, 15, "ABCDEFGHIJKLMNOPQ...")
stdscr.NoutRefresh()
y, x := 10, 20
sWin, _ := gc.NewWindow(4, 8, y, x)
sWin.Keypad(true)
sWin.SetBackground('.')
sWin.Box(0, 0)
sWin.NoutRefresh()
gc.Update()
还有一个非常简单的for
循环,可以帮助移动前景窗口:
main:
for {
// stdscr.Erase()
// stdscr.NoutRefresh()
sWin.MoveWindow(y, x)
sWin.NoutRefresh()
gc.Update()
switch sWin.GetChar() {
case gc.KEY_RIGHT:
x++
case gc.KEY_DOWN:
y++
case 'q':
break main
}
}
sWin.Delete()
stdscr.Delete()
现在,当我移动window 2
时,背景中的那个不会刷新,并且会留下痕迹:
##########################
#######┌┌┌┌┌──────┐#######
#######│││││......│#######
##ABCDE│││││......│...####
#######└└└└└──────┘#######
##########################
##########################
当我取消注解stdscr.Erase()
和stdscr.NoutRefresh()
时,我修复了踪迹,但当然我丢失了背景窗口中的所有数据,如文本"ABCDEFGHIJKLMNOPQ..."
:
#####################
#######┌──────┐######
#######│......│######
#######│......│######
#######└──────┘######
#####################
#####################
我试着将Window 2
作为主窗口的子窗口,但是没有成功。我该如何解决这个问题?ncurses
一般是如何管理重叠窗口的?谢谢!
1条答案
按热度按时间rryofs0p1#
curses并不直接支持这个(参见panel库),否则,你必须使用
touchwin
作为一个解决方案(使用dialog
和cdk
)。