如何在没有Windows API的情况下在Turbo-C ++中创建一个简单的文本编辑器?

时间:2012-07-14 14:31:10

标签: c++ turbo-c++

首先,我想告诉大家我在谷歌和其他地方做了很多研究,但无济于事。

我想知道如何在没有Windows API的情况下在turbo c ++中创建文本编辑器。 我开始用turbo c ++做一段时间,我还学会了如何使用int86()函数包含鼠标,并实现了它。但是我一次又一次地陷入困境。就像现在我被困住了,我如何突出显示选择右键点击文字。

其次,我还学会了如何访问视频内存(无论是假的还是旧的),以便更好地控制文本。

同样对于文本输入我使用大型数组,因为我对使用链接列表进行如此大的文本输入和操作它知之甚少。

注意:由于纯粹的教育原因,我不想使用任何其他IDE或任何API。

请指导我如何让这件事继续下去直到完成。我愿意学习所有其他的东西来完成它。

PS:这是作业。仅用于学习目的。

1 个答案:

答案 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
}

您也可以使用outportbinportb

代替asm
// 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, &regs, &regs);

指向图形像素图的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中,这将失败,并为您提供分段错误或内存访问错误...