Вопрос Log Imgui

На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,023
Реакции[?]
181
Поинты[?]
70K
Как в имгуи вывести консоль лог?
 
На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,023
Реакции[?]
181
Поинты[?]
70K
Короче еще вчера нашел
юзать:
ExampleAppLog my_log;
my_log.AddLog("Тут текст лога %d \n", 1);
my_log.Draw("тут название окна лога, я его убрал");


Кстати кто хочет - может предложить реализацию лога по лучше, ибо в этом логе сначала пишешь что нужно, а потом уже идет отрисовка, нельзя выводить в лог информацию после того как отрисовал

my_log.AddLog("Тут текст лога %d \n", 1);
my_log.Draw("тут название окна лога, я его убрал");




Код:
struct ExampleAppLog
{
    ImGuiTextBuffer     Buf;
    ImGuiTextFilter     Filter;
    ImVector<int>       LineOffsets; // Index to lines offset. We maintain this with AddLog() calls.
    bool                AutoScroll;  // Keep scrolling if already at the bottom.

    ExampleAppLog()
    {
        AutoScroll = true;
        Clear();
    }

    void    Clear()
    {
        Buf.clear();
        LineOffsets.clear();
        LineOffsets.push_back(0);
    }

    void    AddLog(const char* fmt, ...) IM_FMTARGS(2)
    {
        int old_size = Buf.size();
        va_list args;
        va_start(args, fmt);
        Buf.appendfv(fmt, args);
        va_end(args);
        for (int new_size = Buf.size(); old_size < new_size; old_size++)
            if (Buf[old_size] == '\n')
                LineOffsets.push_back(old_size + 1);
    }

    void    Draw(const char* title, bool* p_open = NULL)
    {
        ImGui::SetNextWindowPos(ImVec2(ui::window_pos.x, (ui::window_pos.y + ui::window_size.y)), ImGuiCond_Once);
        ImGui::SetNextWindowSize(ImVec2(ui::window_size.x, ui::window_size.y));
        ImGui::SetNextWindowBgAlpha(1.0f);
        if (!ImGui::Begin(title, p_open, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove))
        {
            ImGui::End();
            return;
        }

        //// Options menu
        //if (ImGui::BeginPopup("Options"))
        //{
        //    ImGui::Checkbox("Auto-scroll", &AutoScroll);
        //    ImGui::EndPopup();
        //}

        // Main window
       /* if (ImGui::Button("Options"))
            ImGui::OpenPopup("Options");
        ImGui::SameLine();*/
       /* bool clear = ImGui::Button("Clear");
        ImGui::SameLine();
        bool copy = ImGui::Button("Copy");
        ImGui::SameLine();
        Filter.Draw("Log Search", -100.0f);

        ImGui::Separator();*/
        ImGui::BeginChild("scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_HorizontalScrollbar);

        /*if (clear)
            Clear();
        if (copy)
            ImGui::LogToClipboard();*/

        ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
        const char* buf = Buf.begin();
        const char* buf_end = Buf.end();
        if (Filter.IsActive())
        {
            // In this example we don't use the clipper when Filter is enabled.
            // This is because we don't have a random access on the result on our filter.
            // A real application processing logs with ten of thousands of entries may want to store the result of
            // search/filter.. especially if the filtering function is not trivial (e.g. reg-exp).
            for (int line_no = 0; line_no < LineOffsets.Size; line_no++)
            {
                const char* line_start = buf + LineOffsets[line_no];
                const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end;
                if (Filter.PassFilter(line_start, line_end))
                    ImGui::TextUnformatted(line_start, line_end);
            }
        }
        else
        {
            // The simplest and easy way to display the entire buffer:
            //   ImGui::TextUnformatted(buf_begin, buf_end);
            // And it'll just work. TextUnformatted() has specialization for large blob of text and will fast-forward
            // to skip non-visible lines. Here we instead demonstrate using the clipper to only process lines that are
            // within the visible area.
            // If you have tens of thousands of items and their processing cost is non-negligible, coarse clipping them
            // on your side is recommended. Using ImGuiListClipper requires
            // - A) random access into your data
            // - B) items all being the  same height,
            // both of which we can handle since we an array pointing to the beginning of each line of text.
            // When using the filter (in the block of code above) we don't have random access into the data to display
            // anymore, which is why we don't use the clipper. Storing or skimming through the search result would make
            // it possible (and would be recommended if you want to search through tens of thousands of entries).
            ImGuiListClipper clipper;
            clipper.Begin(LineOffsets.Size);
            while (clipper.Step())
            {
                for (int line_no = clipper.DisplayStart; line_no < clipper.DisplayEnd; line_no++)
                {
                    const char* line_start = buf + LineOffsets[line_no];
                    const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end;
                    ImGui::TextUnformatted(line_start, line_end);
                }
            }
            clipper.End();
        }
        ImGui::PopStyleVar();

        if (AutoScroll && ImGui::GetScrollY() >= ImGui::GetScrollMaxY())
            ImGui::SetScrollHereY(1.0f);

        ImGui::EndChild();
        ImGui::End();
    }
};
 
Начинающий
Статус
Оффлайн
Регистрация
17 Апр 2020
Сообщения
236
Реакции[?]
24
Поинты[?]
2K
Короче еще вчера нашел
юзать:
ExampleAppLog my_log;
my_log.AddLog("Тут текст лога %d \n", 1);
my_log.Draw("тут название окна лога, я его убрал");


Кстати кто хочет - может предложить реализацию лога по лучше, ибо в этом логе сначала пишешь что нужно, а потом уже идет отрисовка, нельзя выводить в лог информацию после того как отрисовал

my_log.AddLog("Тут текст лога %d \n", 1);
my_log.Draw("тут название окна лога, я его убрал");




Код:
struct ExampleAppLog
{
    ImGuiTextBuffer     Buf;
    ImGuiTextFilter     Filter;
    ImVector<int>       LineOffsets; // Index to lines offset. We maintain this with AddLog() calls.
    bool                AutoScroll;  // Keep scrolling if already at the bottom.

    ExampleAppLog()
    {
        AutoScroll = true;
        Clear();
    }

    void    Clear()
    {
        Buf.clear();
        LineOffsets.clear();
        LineOffsets.push_back(0);
    }

    void    AddLog(const char* fmt, ...) IM_FMTARGS(2)
    {
        int old_size = Buf.size();
        va_list args;
        va_start(args, fmt);
        Buf.appendfv(fmt, args);
        va_end(args);
        for (int new_size = Buf.size(); old_size < new_size; old_size++)
            if (Buf[old_size] == '\n')
                LineOffsets.push_back(old_size + 1);
    }

    void    Draw(const char* title, bool* p_open = NULL)
    {
        ImGui::SetNextWindowPos(ImVec2(ui::window_pos.x, (ui::window_pos.y + ui::window_size.y)), ImGuiCond_Once);
        ImGui::SetNextWindowSize(ImVec2(ui::window_size.x, ui::window_size.y));
        ImGui::SetNextWindowBgAlpha(1.0f);
        if (!ImGui::Begin(title, p_open, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove))
        {
            ImGui::End();
            return;
        }

        //// Options menu
        //if (ImGui::BeginPopup("Options"))
        //{
        //    ImGui::Checkbox("Auto-scroll", &AutoScroll);
        //    ImGui::EndPopup();
        //}

        // Main window
       /* if (ImGui::Button("Options"))
            ImGui::OpenPopup("Options");
        ImGui::SameLine();*/
       /* bool clear = ImGui::Button("Clear");
        ImGui::SameLine();
        bool copy = ImGui::Button("Copy");
        ImGui::SameLine();
        Filter.Draw("Log Search", -100.0f);

        ImGui::Separator();*/
        ImGui::BeginChild("scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_HorizontalScrollbar);

        /*if (clear)
            Clear();
        if (copy)
            ImGui::LogToClipboard();*/

        ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
        const char* buf = Buf.begin();
        const char* buf_end = Buf.end();
        if (Filter.IsActive())
        {
            // In this example we don't use the clipper when Filter is enabled.
            // This is because we don't have a random access on the result on our filter.
            // A real application processing logs with ten of thousands of entries may want to store the result of
            // search/filter.. especially if the filtering function is not trivial (e.g. reg-exp).
            for (int line_no = 0; line_no < LineOffsets.Size; line_no++)
            {
                const char* line_start = buf + LineOffsets[line_no];
                const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end;
                if (Filter.PassFilter(line_start, line_end))
                    ImGui::TextUnformatted(line_start, line_end);
            }
        }
        else
        {
            // The simplest and easy way to display the entire buffer:
            //   ImGui::TextUnformatted(buf_begin, buf_end);
            // And it'll just work. TextUnformatted() has specialization for large blob of text and will fast-forward
            // to skip non-visible lines. Here we instead demonstrate using the clipper to only process lines that are
            // within the visible area.
            // If you have tens of thousands of items and their processing cost is non-negligible, coarse clipping them
            // on your side is recommended. Using ImGuiListClipper requires
            // - A) random access into your data
            // - B) items all being the  same height,
            // both of which we can handle since we an array pointing to the beginning of each line of text.
            // When using the filter (in the block of code above) we don't have random access into the data to display
            // anymore, which is why we don't use the clipper. Storing or skimming through the search result would make
            // it possible (and would be recommended if you want to search through tens of thousands of entries).
            ImGuiListClipper clipper;
            clipper.Begin(LineOffsets.Size);
            while (clipper.Step())
            {
                for (int line_no = clipper.DisplayStart; line_no < clipper.DisplayEnd; line_no++)
                {
                    const char* line_start = buf + LineOffsets[line_no];
                    const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end;
                    ImGui::TextUnformatted(line_start, line_end);
                }
            }
            clipper.End();
        }
        ImGui::PopStyleVar();

        if (AutoScroll && ImGui::GetScrollY() >= ImGui::GetScrollMaxY())
            ImGui::SetScrollHereY(1.0f);

        ImGui::EndChild();
        ImGui::End();
    }
};
Можешь подсказать что не так делаю?1651867199364.pngПросто окно лога есть,а самого лога нет
 
Energy Reload
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции[?]
330
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как в имгуи вывести консоль лог?
Создать консоль, вывести в нее лог.
C++:
void OpenConsole()
{
    HANDLE hConsole;  _CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;

    if (pAllocConsole())
    {
        HANDLE Out = pGetStdHandle(STD_OUTPUT_HANDLE);
        hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, CONSOLE_TEXTMODE_BUFFER, 0);
        GetConsoleScreenBufferInfo(hConsole, &ConsoleScreenBufferInfo);
        SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN);
    }
}
И пишем в консоль
C++:
void Print_(const char *fmt ...)
{
    HANDLE Output = pGetStdHandle(STD_OUTPUT_HANDLE);
    char Buffer[1024];

    char buf[1024];
    va_list va_alist;
    va_start(va_alist, fmt);
    p__stdio_common_vsprintf_s(0, buf, size_t(buf), fmt, NULL, va_alist);
    va_end(va_alist);

    size_t size = miniCRT._strlen(Buffer);
    DWORD dw = size;

    WriteConsoleA(Output, Rus( Buffer), size, &dw, NULL);
}
int arg=10;
Print_("Test: %d",arg);
 
На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,023
Реакции[?]
181
Поинты[?]
70K
Можешь подсказать что не так делаю?Посмотреть вложение 202585Просто окно лога есть,а самого лога нет
сначала должен идти addlog
после этого только draw я описал это тут
Кстати кто хочет - может предложить реализацию лога по лучше, ибо в этом логе сначала пишешь что нужно, а потом уже идет отрисовка, нельзя выводить в лог информацию после того как отрисовал
 
Похожие темы
Сверху Снизу