Member 14074655 Ответов: 0

Как сделать программу ncurses, которая может быть использована при изменении размера?


Я новичок в c++, поэтому, пожалуйста, простите меня, если я совершу несколько глупых ошибок.Поэтому я создаю текстовый редактор, похожий на vim, и использую c++ с ncurses, однако я обнаружил, что изменение размера терминала просто приводит к его абсурдной степени. Я знаю, что это, вероятно, связано с моим небрежным кодом, однако я сделал что-то в операторе while, чтобы заставить его обновить строки и столбцы, однако в то время как некоторые тексты работали, другие ужасно провалились.
Пожалуйста, проверьте мой код, если вы хотите увидеть что-то не так:
#include <iostream>
#include <ncurses.h>
#include <fstream>
#include <string>
#include <cstdlib>
#include <algorithm>
#include "termcolor.hpp"
#include <iomanip>
#include <sstream>
#include <vector>
#include <typeinfo>
#include <bits/stdc++.h>
#include <chrono>
enum state{normal, insrt, command, visual};
state current_state;
void rowminus2(std::string text)
{
    int row, col;
    getmaxyx(stdscr, row, col);
    move(row-2,0);
    char text2[text.length()+1];
    strcpy(text2, text.c_str());
    printw(text2);
}
int main()
{
    current_state=normal;
    int row,col;
    int current_x=0;
    int current_y=1;
    int c;
    initscr();
    raw();
    keypad(stdscr, TRUE);
    move(current_y,current_x);
    noecho();
    while((c=getch())!=530)
    {
        getmaxyx(stdscr,row,col);
        if(c==58&¤t_state==normal)//:Command
        {
            current_state=command;
            move(row-2,0);
            clrtoeol();
            move(row-1,0);
            printw(":");
            echo();
            refresh();
            if(c==263||c==27)
            {
                clrtoeol();
                move(1,0);
                current_state=normal;
                noecho();
            }
            else
            {
                char comm[100];        
                getstr(comm);
                std::string comm_tos=comm;
                if(comm_tos=="o")//opening file
                {
                    move(row-2,0);
                    clrtoeol();
                    rowminus2("File Name: ");
                    refresh();
                    move(row-1,0);
                    clrtoeol();
                    char comm1[100];
                    getstr(comm1);
                    std::string filename=comm1;
                    move(row-2,0);
                    clrtoeol();
                    move(row-1,0);
                    clrtoeol();
                    current_state=normal;
                    move(1,0);
                    noecho();
                }
                else
                {
                    move(row-1,0);
                    clrtoeol();
                    move(row-2,0);
                    clrtoeol();
                    move(1,0);
                    noecho();
                    current_state=normal;
                }
            }
            
        }
        if(c==27&¤t_state!=normal)
        {
            current_state=normal;
        }
        if(current_state==normal)
        {
            move(1,0);
            switch(c)
            {
                case 260:
                    
                    current_x--;
                    break;

                case 261:
                    current_x++;
                    break;

                case 259:
                    current_y--;
                    break;

                case 258:
                    current_y++;
                    break;

            }
            move(current_y,current_x);
            refresh();
        }
    }
    endwin();
    return 0;
}

Шаги для воспроизведения результата:
1 - скомпилируйте его с помощью ncurses
2 - Запустите его и нажмите кнопку full-colon
3 - наберите о и напишите что угодно
4 - Сделайте то же самое еще раз, но введите что-нибудь, кроме o
5. выполните шаги 1-3 еще раз, но измените размер окна, прежде чем нажать enter в :o
6 - вуаля!!

Что я уже пробовал:

Я пробовал обновлять строки и столбцы в while statement, это работает для чего-то, но не для всего.

Richard MacCutchan

А что, ncurses-это такая старая технология? Используйте Win32, для которого есть множество учебников, чтобы сделать правильные приложения Windows.

Member 14074655

Я делаю это в linux. Я забыл упомянуть об этом.

Richard MacCutchan

Видеть linux c gui - поиск в Google[^]

CPallini

Я не видел никакого эффекта (экран пуст после шага 2,3 как до, так и после изменения размера).
Кстати, опубликованный код содержит случайные символы.

Member 14074655

Хм, это странно, для меня, если я пишу :o и изменяю его размер, он действует так, как будто его ввели, и спрашивает меня имя файла, но местоположение getstr перепутано и не работает. То, что вы сказали, действительно работает для :a/b/c/d ... кроме o, потому что я не назначал им функцию, просто сказал им сделать экран пустым.

Richard MacCutchan

Основная проблема заключается в том, что ваш код не будет получать уведомления при изменении размера экрана, поэтому все ваши вызовы ncurses будут основаны на исходном размере. Именно поэтому лучше использовать правильную графическую систему, чтобы ваш код мог учитывать такие изменения (и часто фреймворк действительно будет управлять этим за вас).

0 Ответов