GoNCurses在前台窗口移动后刷新后台窗口

aor9mmx1  于 2023-02-10  发布在  Go
关注(0)|答案(1)|浏览(136)

我正在努力理解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一般是如何管理重叠窗口的?谢谢!

rryofs0p

rryofs0p1#

curses并不直接支持这个(参见panel库),否则,你必须使用touchwin作为一个解决方案(使用dialogcdk)。

相关问题