Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在没有Windows API的情况下在Turbo-C++中制作一个简单的文本编辑器?_C++_Turbo C++ - Fatal编程技术网

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

如何在没有Windows API的情况下在Turbo-C++中制作一个简单的文本编辑器?,c++,turbo-c++,C++,Turbo C++,首先,我想告诉大家,我在谷歌和其他地方做了很多研究,但都没有结果 我想知道如何在没有Windows API的情况下,在Turbo C++中编写文本编辑器。 我开始在Turbo C++中做了一些工作,我还学会了如何使用Itn8函数来包含鼠标。但我一次又一次地被什么东西卡住了。就像现在一样,我被困在如何突出显示并选择要右键单击的文本中 第二,我还学会了如何访问视频存储器,无论这些天它可能是假的或旧的,以便更好地控制文本 同样对于文本输入,我使用了一个大数组,因为我对使用链接列表进行如此大的文本输入和

首先,我想告诉大家,我在谷歌和其他地方做了很多研究,但都没有结果

我想知道如何在没有Windows API的情况下,在Turbo C++中编写文本编辑器。 我开始在Turbo C++中做了一些工作,我还学会了如何使用Itn8函数来包含鼠标。但我一次又一次地被什么东西卡住了。就像现在一样,我被困在如何突出显示并选择要右键单击的文本中

第二,我还学会了如何访问视频存储器,无论这些天它可能是假的或旧的,以便更好地控制文本

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

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

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


附言:这不是家庭作业。只是为了学习。

我记得,您可以通过设置AX ah:al寄存器并调用INT 10h来设置视频模式

然后在内存地址0xA000处访问像素映射。如果选择带有256调色板的视频模式f.e.320x200,则可以通过将颜色索引写入端口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
}
您也可以使用outportb和inportb代替asm

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

该死,你让我想起我17岁的时候,那是15年前的事了。尊敬:该死!这就是目标+1.感谢您的所有评论和+1 lol。但问题仍然存在。您的目标是真正的DOS还是Win32控制台?您需要阅读数据结构-您已经达到了使用直阵列的极限。您还可以将源代码提供给一个更简单的OSS编辑器,如edasm,它比我略高一点,因此您可以解释一下如何使用outportb和inportb。非常感谢。你所做的一切都超出了你的想象。您需要退一步学习一些基础知识,从数据结构开始。对数据结构有一个坚定的理解对于解决非平凡的编程问题是绝对必要的,而您在这里尝试做的事情绝对是非平凡的。这就像告诉我们你想建一座房子,但你不知道如何筑墙,也不想学习。谢谢。我得认真研究一下。顺便说一句,我想学习,这也是我在问题中说的。我不知道研究这些东西是否真的值得,今天的编程环境和语言要复杂得多。我认为你最好学会使用更高层次的框架。除非你真的想坚持DOS或者想从头开始编写自己的操作系统@我会同时这么做。正是完全的好奇心驱使我来到这里,去了解它到底是如何工作的或曾经是如何工作的。
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';