【发布时间】:2010-05-24 20:53:19
【问题描述】:
这样的 GUI 是如何制作的,但在控制台应用程序中?
例子很多,比如alsamixer:
【问题讨论】:
这样的 GUI 是如何制作的,但在控制台应用程序中?
例子很多,比如alsamixer:
【问题讨论】:
Curses 库可用于创建此类用户界面。这是 NCurses 的introduction - 最著名的 Curses 实现。
【讨论】:
大多数控制台平台都有像 goto(x, y) 这样的函数来将光标定位在屏幕上的某个位置。
这可用于使用您想要的任何 ascii 字符/颜色“绘制”屏幕。
【讨论】:
Termbox 是 ncurses 的一个有趣替代方案,您可能也会感兴趣。
【讨论】:
在 DOS 上,在 Windows 出现之前有许多不同的“GUI”API 可用,如果您想直接编码,所有这些基本上都隐藏了您需要进行的底层 VGA 调用。我个人使用的包括 TurboPascal 和 Foxpro。简而言之,甚至还有一个用于 DOS 的 Visual Basic,其中包含类似的 API。除了输出文本外,这些 API 通常还包括下拉菜单、绘制简单框和阴影等功能。一些更复杂的甚至会有基于字符的“Windows”,您可以用光标在屏幕上拖动。
VGA 可以在文本(非常类似于大型机终端,您实际上只在行/列中输出一个字符)或图形模式下访问,这更类似于 GDI(尽管您必须执行 所有操作 你自己,很慢,除了早期的绘画和 cad 程序之外很少用于任何东西)。您的示例是文本模式。
在 Unix 上,此类考虑更为流行,标准是使用 Curses,这是一个类似的文本模式 API,它隐藏了底层终端特征。
【讨论】:
Curses 等库的执行方式与窗口管理器运行图形环境的方式非常相似。窗口、按钮、复选框等控件都是由库定义的。
您将文本写入窗口或设置某些控件的文本,而不是向屏幕写入文本。该库跟踪窗口、重叠、边框效果、阴影、拖动行为(如果支持鼠标)。它建立了字符、前景色和背景色的字符缓冲区。
发布的 goto(x, y) 示例可以工作,但如果实现对每个字符都执行此操作,则性能会明显滞后。为了获得快速性,当您对某些文本或其他属性进行更改时,库会知道需要从字符缓冲区更新的矩形区域,并通过优化调用将该区域的新字符数据以一个块的形式写入屏幕到视频驱动程序。
与仅将每个可打印字符回显到屏幕的基本控制台应用程序不同,这些高级应用程序中的键盘输入会被截获,并且此类字符会更明确地写入(或不写入,在您的应用程序的热键的情况下)右侧窗户什么的。
我希望 .Net 有一个完整的内置控制台窗口库。... [叹气] 我认为那些旧的控制台风格的应用程序看起来很漂亮。
【讨论】: