首先,我想告诉大家我在谷歌和其他地方做了很多研究,但无济于事。
我想知道如何在没有Windows API的情况下在turbo c ++中创建文本编辑器。 我开始用turbo c ++做一段时间,我还学会了如何使用int86()函数包含鼠标,并实现了它。但是我一次又一次地陷入困境。就像现在我被困住了,我如何突出显示和选择右键点击文字。
其次,我还学会了如何访问视频内存(无论是假的还是旧的),以便更好地控制文本。
同样对于文本输入我使用大型数组,因为我对使用链接列表进行如此大的文本输入和操作它知之甚少。
注意:由于纯粹的教育原因,我不想使用任何其他IDE或任何API。
请指导我如何让这件事继续下去直到完成。我愿意学习所有其他的东西来完成它。
PS:这是不作业。仅用于学习目的。
答案 0 :(得分:3)
正如我记得的那样,你通过设置AX(ah:al)寄存器并调用INT 10h see this来设置视频模式。
然后在存储器地址0xA000处访问像素图。如果您选择视频模式f.e. 320x200具有256色调色板,您可以通过将颜色索引写入端口0x3C8来设置RGB色块,然后将红色值写入0x3C9,将绿色值写入0x3C9并将蓝色值写入0x3C9。
// select mode 320x200
asm {
mov ah, 0
mov al, 13
int 10h
}
// set red background (color index 0)
asm {
mov dx, 0x3c8
mov al, 0
out dx, al
mov dx, 0x3c9
mov al, 0xff
out dx, al
mov al, 0x00
out dx, al
out dx, al
}
您也可以使用outportb
和inportb
// Set color with index 5 in color palette with outportb:
outportb(0x3c8, 5); // color with index 5
outportb(0x3c9, 0xFF); // red channel value
outportb(0x3c9, 0x00); // green channel value
outportb(0x3c9, 0x00); // blue channel value
在C中更改视频模式,可能是这样的:
union REGS regs;
regs.w.ax = 13;
int86(0x10, ®s, ®s);
指向图形像素图的C指针:
volatile unsigned char *pixmap = (volatile unsigned char *)0xA000;
// Write a pixel with color index 5 to X:10 Y:25 in 320x200x256 video mode:
pixmap[10 + 25 * 320] = 5;
指向文本地图的C指针:
volatile char *charmap = (volatile char *)0xB800;
// Write hello world in text-mode
int offset = 0;
charmap[offset++] = 'H';
charmap[offset++] = 'e';
charmap[offset++] = 'l';
charmap[offset++] = 'l';
charmap[offset++] = 'o';
charmap[offset++] = ' ';
charmap[offset++] = 'w';
charmap[offset++] = 'o';
charmap[offset++] = 'r';
charmap[offset++] = 'l';
charmap[offset++] = 'd';
请注意,所有这些东西都假设您处于DOS模式,我没有测试它。在Windows中,这将失败,并为您提供分段错误或内存访问错误...