Перейти к содержанию
Опубликовано
comment_409

В ImGui есть такая интересная штука, как ListBox

 

 

 

Пример

3b41347cc23a.png

 

 

 

Всё хорошо, но есть одно ограничение, а конкретно то, что функция 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);

В скором времени могу слить исходник этой программы.

ffb29e68775f.png

With love by P45H3 =)

02a1fd3cc9ed.png

 

 

Рекомендуемые сообщения

Нет сообщений для отображения
Гость
Эта тема закрыта для публикации ответов.