0

我现在正在学习,我有这个家庭作业/任务要做:

1) 如果你按下CTRL + L键,所有的数字符号都应该改变颜色。

2) 如果你按下CTRL + S键,你会得到单词的长度,从光标左边。

我找到了这个功能int bioskey(int cmd); 所以现在我可以检查是否按下了键,但是如何仅更改数字符号的颜色,或者从控制台读取单词以获取它们的长度?

4

1 回答 1

1

我们中的一些人仍然记得MS-DOS(让它安息吧……)

如果您真的在MS-DOS中,那么您不能指望控制台的内容会仅针对特定区域更改颜色。你需要自己做。问题是我们对您的项目背景一无所知,所以我们不知道您的东西是什么以及如何表示,渲染/输出/输入等......

我假设使用了EGA/VGA BIOS文本模式,因此您可以利用对VRAM的直接访问。因此,您需要设置指向地址的指针B800:0000并将其作为数组处理,其中屏幕上的每个字符都有 2 个字节。一个是颜色属性,另一个是ASCII码(不确定顺序)...

所以对于已经渲染的东西,你只需:

  1. 循环整个屏幕

    通常是80x25x2字节

  2. 测试每个 ASCII 的字母数字值

    所以 ASCIIcode >= '0'code<='9'数字或添加所有你正在考虑的东西作为字母数字code>' 'code<='9'.

  3. 更改所选字符的颜色

    只需更改属性字节即可。

当你把它放在一起得到数字时,它看起来像这样:

char far *scr=(char far*)0x0B0000000;
int x,y,a;
for (a=0,y=0;y<25;y++)
 for (x=0;x<80;x++,a+=2)
  if ((scr[a+0]>='0')&&((scr[a+0]<='9'))
  {
  scr[a+1]=7; //attribute with the different color here
  }

如果它不起作用,请尝试交换scr[a+0]scr[a+1]. 如果发生异常,那么您不在MS-DOS中,并且您无权访问VRAM。在这种情况下,使用允许访问内存的 DOS-BOX或驱动程序,如 dllportio ...有关更多信息,请参阅一些或多或少相关的 QA:

如果您在检测时遇到问题,CTRL+Key不确定TC++中的内置功能是否允许CTRL(很久以前),那么您可以利用BIOS甚至连接键盘ISR。请参阅第二个链接,其中存在用于键盘处理程序的ISR ...您可以将其移植到C++或谷歌那里一定有很多示例,尤其是TP7.0(它是帕斯卡,但很容易移植到TC++

于 2016-11-08T09:45:53.643 回答