На самом деле я Zodiak
-
Автор темы
- #1
Как в имгуи вывести консоль лог?
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();
}
};
Можешь подсказать что не так делаю?Просто окно лога есть,а самого лога нетКороче еще вчера нашел
юзать:
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(); } };
Создать консоль, вывести в нее лог.Как в имгуи вывести консоль лог?
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);
}
}
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);
}
сначала должен идти addlogМожешь подсказать что не так делаю?Посмотреть вложение 202585Просто окно лога есть,а самого лога нет
Кстати кто хочет - может предложить реализацию лога по лучше, ибо в этом логе сначала пишешь что нужно, а потом уже идет отрисовка, нельзя выводить в лог информацию после того как отрисовал
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz