2

まず最初に、私は Google などで多くの調査を行いましたが、役に立たなかったことをお伝えしたいと思います。

Windows API を使用せずに Turbo C++ でテキスト エディターを作成する方法を知りたいです。私はターボC ++でしばらく前に作成を開始し、int86()関数を使用してマウスを含める方法も学び、それを実装しました。しかし、何度も私は何かに引っかかっています。今のように、右クリックのためにテキストを強調表示して選択する方法に行き詰まっています。

第二に、テキストをより適切に制御するために、ビデオ メモリにアクセスする方法も学びました (最近ではそれが偽物または古いものである可能性があります)。

また、テキスト入力には大きな配列を使用しています。これは、このような大きなテキスト入力にリンク リストを使用して操作することについてほとんど知識がないためです。

注: 純粋に教育上の理由から、他の IDE や API を使用したくありません。

このことを完了するまでさらに進める方法を教えてください。私はそれを完了するために、すべての追加事項を喜んで学びます。

PS: これは宿題ではありません。学習目的のためだけに。

4

1 に答える 1

3

私が覚えているように、AX (ah:al) レジスタを設定し、INT 10h を呼び出すことでビデオ モードを設定します。これを参照してください

次に、メモリ アドレス 0xA000 でピクセル マップにアクセスします。ビデオ モード fe 320x200 を 256 カラー パレットで選択した場合、ポート 0x3C8 にカラー インデックスを書き込み、次に Red 値を 0x3C9 に書き込み、Green 値を 0x3C9 に書き込み、Blue 値を 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
}

outportbasm の代わりにandも使用できます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, &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 に答える