2

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

我想知道如何在没有 Windows API 的情况下继续在 turbo c++ 中制作文本编辑器。我开始在 turbo c++ 中使用它,我还学习了如何使用 int86() 函数包含鼠标,并且我实现了它。但是我一次又一次地被困在某件事上。就像现在我被卡住了如何突出显示选择文本以进行右键单击。

其次,我还学习了如何访问视频内存(无论这些天多么虚假或陈旧),以便更好地控制文本。

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

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

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

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

4

1 回答 1

3

我记得,您通过设置 AX (ah:al) 寄存器并调用 INT 10h 来设置视频模式,请参阅此

然后在内存地址 0xA000 访问像素图。如果您选择视频模式 fe 320x200 和 256 调色板,您可以通过将颜色索引写入端口 0x3C8,然后将红色值写入 0x3C9,将绿色值写入 0x3C9 并将蓝色值写入 0x3C9 来设置 RGB 调色板。

// 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
}

除了 asm,您还可以使用outportbandinportb

// 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 中,这将失败并给您分段错误或内存访问错误...

于 2012-07-14T14:46:55.143 回答