好吧,这是我正在做的一些小背景。我正在开发一个小文件系统的操作系统。它是部分汇编器和C部分编写的。我试图实现热键以使系统循环遍历颜色,交换前景和背景颜色,完全清除屏幕等。这里是我正在使用的功能在C中获取操作系统的默认颜色
PRIVATE void my_toy_shell(u16_t key) {
u32_t color = 0;
char fg_color, bg_color, newcolor;
// Colors
newcolor = 0x2a;
fg_color = 0x0E;
bg_color = 0x10;
switch(key) {
case C('D'): /* ctrl-d set default color */
newcolor = 0x1E;
color = newcolor;
__clr_screen(color,_NO_FILL);
break;
case C('S'): /* ctrl-s swap bg and fg color */
bg_color = color & 0xF0;
fg_color = color & 0x0F;
newcolor = fg_color | bg_color;
color = newcolor;
__clr_screen(color,_NO_FILL);
break;
case C('F'): /* ctrl-f cycle fg color */
if(fg_color == 0x0F)
fg_color = 0x00;
else
fg_color<<;
color = bg_color | fg_color;
__clr_screen(color, _NO_FILL);
break;
case C('G'): /* ctrl-g cycle bg color */
/*if(bg_color == 0x70)*/
break;
case C('Q'): /* ctrl-q reset */
/*Clears screen*/
__clr_screen(_IOTA_TTY_COLOR,_FILL_BLANK);
_display_welcome();
break;
}
}
现在只是为了验证这些函数是否正常工作,我已经硬编码了“newcolor”,“fg_color”和“bg_color”。 CTRL-D是正确的功能,以及CTRL-Q。 CTRL-S应该交换前景色和背景色。 这是我变得困惑的地方。为了在屏幕上交换当前颜色,我被告知颜色为0x0F或0xF0,这取决于我想要为fg或bg获取哪个值。但是我不确定如何获取当前显示在屏幕上的颜色。蓝色默认为黄色(0x1E)。我还发现,当我尝试其他颜色时,任何高于十六进制值8的颜色都会给我0-7的颜色,但会导致屏幕闪烁。使用按位“&”和“|”应该让我得到我需要交换的相应值。不过,我的问题是获得屏幕上的当前颜色。我不确定这是否需要尝试在其他位置的文件中找到,或者是否有内置于C的内容,我可以使用这些值来获取这些值。
编辑:我想通了。原来我在另一个文件中有一个属性被导入到名为_color_attr
的包含当前颜色的文件中。
'__clr_screen'是一个函数,它需要两个参数,一个颜色,并且它出现一个字的属性。当使用“_FILL_BLANK”时,它将清除屏幕上的所有内容,使用“_NO_FILL”时,屏幕上的所有内容都不会被修改。这是另一个文件中的用户定义的函数,它被导入到这个文件中。我基本上是使用这个函数来在需要时将所有内容保留在屏幕上,并且在需要时清除屏幕,就像按CTRL-Q时一样。 – kszalai 2015-04-05 16:44:21