Опубликовано 1 апреля, 20188 г. comment_409 В ImGui есть такая интересная штука, как ListBox Пример Всё хорошо, но есть одно ограничение, а конкретно то, что функция ListBox в качестве элементов принимает указатель на массив строк, а я хочу передатьтуда vector<string>, как же это сделать? Нам нужно описать простою CallBack функцию и перегрузить оригинальныйListBox. Callback: static auto vector_callback = [](void* vec, int idx, const char** out_text) { auto& vector = *static_cast<vector<string>*>(vec); if (idx < 0 || idx >= static_cast<int>(vector.size())) { return false; } *out_text = vector.at(idx).c_str(); return true; }; ListBox overloaded: bool ListBox(const char* label, int* currIndex, vector<string>& values) { if (values.empty()) { return false; } return ListBox(label, currIndex, vector_callback, static_cast<void*>(&values), values.size()); } Возможное применение: void AddProcessToVec() { hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); m_ProcNames.clear(); if (Process32First(hSnap, &pe)) { while (Process32Next(hSnap, &pe)) { m_ProcNames.push_back(pe.szExeFile); } } } static int VotedIdx = 0; ImGui::ListBox("##List1", &VotedIdx, proc.m_ProcNames);В скором времени могу слить исходник этой программы. With love by P45H3 =)
comment_409В ImGui есть такая интересная штука, как ListBox
Пример
Всё хорошо, но есть одно ограничение, а конкретно то, что функция ListBox
в качестве элементов принимает указатель на массив строк, а я хочу передать
туда vector<string>, как же это сделать?
Нам нужно описать простою CallBack функцию и перегрузить оригинальный
ListBox.
Callback:
static auto vector_callback = [](void* vec, int idx, const char** out_text) { auto& vector = *static_cast<vector<string>*>(vec); if (idx < 0 || idx >= static_cast<int>(vector.size())) { return false; } *out_text = vector.at(idx).c_str(); return true; };ListBox overloaded:
bool ListBox(const char* label, int* currIndex, vector<string>& values) { if (values.empty()) { return false; } return ListBox(label, currIndex, vector_callback, static_cast<void*>(&values), values.size()); }Возможное применение:
void AddProcessToVec() { hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); m_ProcNames.clear(); if (Process32First(hSnap, &pe)) { while (Process32Next(hSnap, &pe)) { m_ProcNames.push_back(pe.szExeFile); } } }static int VotedIdx = 0; ImGui::ListBox("##List1", &VotedIdx, proc.m_ProcNames);В скором времени могу слить исходник этой программы.
With love by P45H3 =)