使用VB.NET在控制台内提供真彩色支持

问题描述 投票:2回答:3

使用控制台应用程序时,人们不禁会注意到本机命令BackgroundColor和ForegroundColor仅支持CGA色谱(黄色,红色,深黄色,深红色等)

我想做的是扩展它,以便我可以使用我当前分辨率(又名真彩色等)支持的任何颜色,而不仅仅是这个有限的颜色池。

在编写DOS应用程序时(是的.DOS ---古老的学校DOS),我没有任何问题选择几乎任何颜色超出此限制。我记得在.NET(2002年)的婴幼儿时期看到了有关如何做到这一点的一些事情,但我无法找到它,因为搜索中关于“控制台”和“颜色”的每个链接都会提出如何着色,并且仅在图像中描绘的绝对最基本的颜色---基本上向人们展示了如何更改ForegroundColor和BackgroundColor属性。

要澄清 - 我希望能够使用TRUE COLOR aka,使用VB.NET在控制台应用程序中使用字体颜色和背景颜色的整个色谱。

我在这里发现了一篇文章,展示如何找到任何给定颜色的“最接近”控制台颜色,但这不起作用。基本颜色缺少许多真正的颜色,如橙色 - 以及至少1000种其他命名颜色。

我可以通过使用Win32 / etc API来破解垃圾,而逻辑认为这必须是可能的,因为在控制台内运行的大量应用程序允许真正的颜色或至少VGA支持。

vb.net colors console-application
3个回答
2
投票

结果我原来的评论有点为时过早。我只有一半的权利。控制台窗口不仅支持这16种颜色(即标准VGA调色板)。它支持其他颜色,但一次只支持16种颜色。您可以将调色板中的颜色更改为您想要的任何颜色,但最多为16。

您可以通过右键单击控制台窗口,转到“属性”并翻转到“颜色”选项卡来查看调色板。从颜色行中选择一种颜色,您可以将其自定义为您想要的任何RGB值。您可以在运行使用这些颜色的应用程序来查看效果时执行此操作。

SetConsoleScreenBufferInfoEx函数提供了一个编程API来设置这些颜色,但它仅在Windows Vista及更高版本上受支持。您可以从.NET应用程序进行P / Invoke。看起来有一些sample code on pinvoke.net。请注意直接从该站点复制和粘贴声明 - 我发现了很多错误,因此有很多其他Stack Overflow用户,从我看过的问题来看。您还可以在this question中找到有关此技术的信息。将C#代码翻译成VB.NET应该是微不足道的。

如果您需要支持较旧的操作系统(谁不支持?),您将不得不求助于未记录的API。这通常是有风险的,因为在操作系统更新时您的代码可能会中断,但是当您仅将其用于那些没有新更新的操作系统时,这并不是什么大问题。在网上搜索,我看到一些示例代码here。文件中没有给出任何学分,所以我猜它是由Catch22.net的所有者James Brown写的。我认为它属于公共领域,但我没有证据支持这一点。如果你对WinDbg很方便,你可以自己进行逆向工程。

这两种方法都会做同样的事情。您将有效地将标准的16种颜色重新映射到您选择的任何颜色,从而可以显示更生动的图像。例如,您可能认为没有人需要“深黄色”,因此您可以将其替换为橙色。您甚至可以不断重置调色板以创建特殊效果。

你描述的游戏可能是一个例外。老派游戏程序员经常颠覆操作系统并直接与视频驱动程序通信,以试图获得额外的性能。在那些日子里,它曾经是必要的。这样做的结果是,他们能够访问一些未被操作系统直接暴露的其他模式,如mode 13h。它具有320x200像素的固定分辨率,但它有两个主要好处:(1)它允许简单,直接访问视频内存,(2)它允许使用固定的VGA 256色调色板。

我知道你可以从DOS做到这一点,但我不确定你是否可以从NT DOS做到这一点。也许你可以,因为你说游戏是在Windows XP上运行的。即使你可以,你也会很难开始。现代编译器不包含任何允许您直接与视频硬件交互的库。您可能想要了解Turbo C之类的老式编译器,看看它是如何完成的。 graphics.h标题为所有这些东西提供了一个很好的界面。

说实话,所有这一切都在我的时间之前,但我相信你基本上称之为中断,就像这样

mov  al, 13h
mov  ah, 0h
int  10h

我敢打赌,NT的控制台会在这方面打击你。

稍微好一点的解决方法可能是直接获取控制台的图形缓冲区。我自己从来没有尝试过,但this site认为这是可能的,尽管也没有记录。它还指出它只适用于32位Windows,因为它的唯一目的是驱动16位模拟器,让你在13h模式下玩那些旧的DOS游戏。


6
投票

控制台只是为了提供一种从较旧的操作系统版本移植文本模式程序的方法。这些年来,你对可能发生的事情的记忆可能过于朦胧。 MS-Dos从未提供过直接设置ANSI.SYS设备驱动程序之外的颜色的方法,您必须发送转义码来改变文本颜色。很大程度上被忽略,更常见的是使用BIOS,interrupt 10h,功能9.BL寄存器指定属性,前景色为4位,背景色为4位。视频适配器和显示器中的颜色选择是硬连线的。

但到目前为止,最常见的方法是直接写入视频帧缓冲区,地址0xB800:0。屏幕上的每个单元格都由两个字节映射,1表示字符,1表示属性。主要有必要对早期视频适配器滚动屏幕时遭受的可怕眨眼做些什么。 CGA并不是IBM工程的胜利。赫拉克勒斯是一家制造very popular alternative的公司,它实际上设定了自己的标准。

PC游戏通过VGA适配器得到了提升,就像Doom一样。作为CGA和EGA适配器的后继产品,它支持256种彩色图形模式。它需要一个不同的监视器,一个模拟监视器,并有一个可编程DAC(数模转换器),256个寄存器,从可能的1600万个中选择256色。这向世界介绍了调色板的概念,这是一个非常痛苦的编程挑战。我非常不情愿地记得与RealizePalette() winapi功能作斗争。

Windows也是真彩色24bpp视频适配器的主要推动力,突破了BIOS模式的局限。 1994年左右,他们开始变得负担得起。这种支持从未被反向移植到BIOS,它在20世纪80年代一直停滞不前。

您从Windows 9x中记住的不是控制台。旧的16位DOS程序在模拟器中运行。他们继续使用视频帧缓冲器,写入0xB800:0用于文本模式,0xA000:0用于图形模式,并直接旋转视频适配器控制寄存器。主要支持拦截直接硬件访问由处理器提供,它以“虚拟8086”模式运行。该模拟器的一个重要子组件是“视频采集器”,一种可以将虚拟化视频适配器内存映射到窗口中像素的驱动程序。这是你记得看到的窗口。值得注意的是Alt + Enter按键,它可以即时关闭视频采集器,在全屏和窗口视图之间来回切换。

长话短说,控制台窗口只试图模拟BIOS文本视频模式。所需的一切。通过对“属性”的固定解释,4位为前景选择16种颜色中的1种,为背景选择4位。使用图形视频模式的程序必须全屏运行。几乎没有工作,64位版本的Windows不再能够将处理器切换到虚拟8086模式,AMD /英特尔不再支持它。

BIOS文本模式有一些扩展,窗口没有固定到固定的宽度和高度,并支持滚动。控制台窗口支持调色板的概念。您不必满足于花哨的传统颜色,您可以直接从系统菜单中更改它们。属性菜单项,颜色选项卡。以编程方式使用SetConsoleScreenBufferInfoEx(),CONSOLE_SCREEN_BUFFER_INFOEX.ColorTable member完成。一个包含16个RGB值的数组。否则另一个强烈的提醒是16是一个坚硬的限制:)并且该属性从8位扩展到16位,为特殊效果提供7 extra bits。很少使用,包含winapi控制台功能的apis也基于传统的BIOS功能。


1
投票

在这里自我推销:

https://github.com/aybe/TrueColorConsole

.NET System.Console的24位着色和VT功能!

  • 95%的功能已经实施
  • 要输出24位,它只需要一个VTConsole.WriteLine(string, Color)

(直到MSFT决定将其直接添加到框架中)

© www.soinside.com 2019 - 2024. All rights reserved.