Windows.h-GUI作为CMD

时间:2018-11-15 16:15:16

标签: c++

我是一名学生,正在寻求帮助,因此我可以处理要通过的项目。 我不是母语人士,我不会说流利的英语,但相信我,我会尽力而为。

我的教授希望我仅使用控制台中的Windows.h来用C ++编写“文本编辑器”。首先,最简单的情况是最多获取6个字母,然后在屏幕上打印出来。第二,半大写字母最多可输入6个字母,但每个字母都必须按Enter键后才能输入。第三-最难的是最多获取6个字母,但如果会有更多的字母,则文字应被覆盖。

示例:E X A M P L E S-> E S A M P L E S

因此,我首先需要一些线索或想法。其次,我需要一些帮助来理解Windows.h。我读了很多文档,但是在这里,我说WriteConsole函数对我来说是个黑魔法:

lpNumberOfCharsWritten [输出] 指向一个变量的指针,该变量接收实际写入的字符数。

我一点也不明白。我只需要将选定的键写入缓冲区,然后将其打印出来即可。 我被卡住了。

谢谢您的每一个回答。 //编辑

有了您的两个答案,我终于继续前进了,谢谢您的宝贵时间。

但是我现在在打印特定密钥到控制台时遇到问题。

**

while (counter++ <= 100)
{
    // Wait for the events. 

    for (i = 0; i < cNumRead; i++)
    {
        switch (irInBuf[i].EventType)
        {
        case KEY_EVENT: // keyboard input 
            ++dwWriteCoord.X;
            KeyEventProc(irInBuf[i].Event.KeyEvent);

            WriteConsoleOutputCharacter(hStdout,
                    irInBuf[i].Event.KeyEvent.uChar, // this line is wrong
                    1,
                    dwWriteCoord,
                    &cNumRead);
            break;      

        default:
            break;
        }
    }
}

** 我继续进行文档编制,但我不知道如何打印特定密钥。

此刻,我将KeyEventProc保留为空。

所以我只想按f并在屏幕上打印'f',然后按o并在屏幕上打印'o'。

2 个答案:

答案 0 :(得分:2)

让我们复制文档以供参考

from
  

lpNumberOfCharsWritten [out]指向接收变量的变量的指针   实际书写的字符数。

因此,我们知道第四个参数必须是指向变量的指针。什么类型的变量?好吧,指针是to。用微软的话来说,0是指向X的指针,所以valid_toBOOL WINAPI WriteConsole( _In_ HANDLE hConsoleOutput, _In_ const VOID *lpBuffer, _In_ DWORD nNumberOfCharsToWrite, _Out_ LPDWORD lpNumberOfCharsWritten, _Reserved_ LPVOID lpReserved ); LPDWORD是一些未指定的32位类型。可能是LP-X,可能是LPDWORD。您不需要关心。

无论哪种方式,您都应该非常了解C ++,知道DWORD*是地址运算符,因此DWORD是指向std::unit32_t的指针。

答案 1 :(得分:0)

以下内容将反向写入一个字符串。因此,这是WriteConsoleOutputCharacter函数的示例。它获取当前光标位置,然后将X值增加字符串的长度。然后,它会写出每个字符,从第一个字符开始,然后递减每个字符的光标位置。

int main()
{
    HANDLE hStdOut;
    wchar_t s[] = L"reverse";
    CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;
    COORD dwWriteCoord;
    DWORD NumberOfCharsWritten;

    std::wcout << s << '\n';

    hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(hStdOut, &ConsoleScreenBufferInfo);
    dwWriteCoord = ConsoleScreenBufferInfo.dwCursorPosition;
    dwWriteCoord.X += wcslen(s);
    for (int i = 0; i < wcslen(s); ++i) {
        --dwWriteCoord.X;
        WriteConsoleOutputCharacter(hStdOut, s+i, 1, dwWriteCoord, &NumberOfCharsWritten);
        }

    return 0;
}

名称WriteConsoleOutputCharacter似乎令人困惑。它写的是字符 s (复数,因此是字符串),而不是字符。