【问题标题】:How to make a simple text editor in Turbo-C++ without Windows API?如何在没有 Windows API 的情况下用 Turbo-C++ 制作一个简单的文本编辑器?
【发布时间】:2012-07-14 03:13:28
【问题描述】:

首先,我想告诉大家,我在 Google 和其他地方进行了大量研究,但无济于事。

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

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

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

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

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

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

【问题讨论】:

  • 该死的,你让我想起了我 17 岁的时候(那是 15 年前)。尊重:)
  • 该死!那是相当的目标! +1!!!!!!
  • 感谢您的所有 cmets 和 +1 大声笑。但问题依然存在。
  • 你的目标是真正的 DOS 还是 Win32 控制台?
  • 你将需要阅读数据结构——你已经达到了使用直数组所能做的极限。您还可以将源代码获取到更简单的 OSS 编辑器之一,例如 ed

标签: c++ turbo-c++


【解决方案1】:

据我所知,您通过设置 AX (ah:al) 寄存器并调用 INT 10h see this 来设置视频模式。

然后在内存地址 0xA000 访问像素图。如果您选择视频模式 f.e. 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
}

你也可以使用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 中,这将失败并给您分段错误或内存访问错误...

【讨论】:

  • asm 有点超出我的想象,所以你能解释一下使用 outportb 和 inportb 吗?非常感谢。
  • 您正在尝试的事情超出了您的想象。你需要退后一步学习一些基础知识,从数据结构开始。对数据结构有深刻的理解对于解决重要的编程问题是绝对必要的,而您在这里尝试做的事情绝对是不平凡的。这就像告诉我们你想盖房子,但你不知道如何砌墙,不想学习。
  • 谢谢。我将不得不做一些认真的研究。 (顺便说一句,我想学习,这也是我在问题中所说的)
  • 我不知道是否真的值得研究这些东西,今天的编程环境和语言都更加复杂。认为您最好学习使用更高级别的框架。除非你真的想坚持使用 DOS 或者想从头开始编写自己的操作系统 ;)
  • @WouterH 我正在同时这样做。是完全的好奇心驱使我来到这里,想了解它实际上是如何工作的或过去是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多