#pragma once //#include "KsCPP_Exports.h" #include #include #include #include "StringHelper.h" template class _CKsComboBox : public T { public: using CComboBox::AddString; int AddString(const std::wstring& str) { return CComboBox::AddString(str.c_str()); } int AddString(const std::string& str) { return CComboBox::AddString(utf8_16(str).c_str()); } void AddStrings(const wchar_t *const* str, size_t num) { for (int i = 0; i < num; i++) { AddString(str[i]); } } void AddStrings(const char *const* str, size_t num) { for (int i = 0; i < num; i++) { AddString(utf8_16(str[i]).c_str()); } } template ::value>::type> void AddStrings(const wchar_t* const * str, const T *val, size_t num) { for (int i = 0; i < num; i++) { AddString(str[i]); SetItemData(i, val[i]); } } template ::value>::type> void AddStrings(const char* const* str, const T* val, size_t num) { for (int i = 0; i < num; i++) { AddString(utf8_16(str[i]).c_str()); SetItemData(i, val[i]); } } template ::value>::type> void AddStrings(const T *val, size_t num, int w = 0) { CString tmp; if (w == 0) { for (int i = 0; i < num; i++) { tmp.Format(_T("%d"), val[i]); AddString(tmp); } } else { CString formatStr; formatStr.Format(_T("%%dd"), w); for (int i = 0; i < num; i++) { tmp.Format(formatStr, val[i]); AddString(tmp); } } } template //T为整形或枚举 int AddWithValue(STRT str, T val) { auto index = AddString(str); if (index >= 0) { SetItemData(index, (DWORD_PTR)val); } return index; } template int AddWithPtr(STRT str, T* val) { auto index = AddString(str); if (index >= 0) { SetItemDataPtr(index, val); } return index; } uint16_t ToUShort(uint16_t def=0, bool *ok=nullptr) { CString tmp; int index = GetCurSel(); if (index < 0) { if (ok) *ok = false; return def; } else { GetLBText(index, tmp); if (ok) *ok = true; //注意没有判断是否是数值串 return uint16_t(_tcstol(tmp, NULL, 10)); } }; uint8_t ToU8(uint8_t def = 0, bool* ok = nullptr) { CString tmp; int index = GetCurSel(); if (index < 0) { if (ok) *ok = false; return def; } else { GetLBText(index, tmp); if (ok) *ok = true; //注意没有判断是否是数值串 return uint8_t(_tcstol(tmp, NULL, 10)); } }; // 获取当前选项的字符串 bool getCurrentText(CString& strSelectedText) { int nSel = GetCurSel(); // 假设m_ComboBox是你的CComboBox对象 if (nSel != CB_ERR) // 检查是否有选中项 { GetLBText(nSel, strSelectedText); // 获取选中的文本 return true; } return false; } // Combo选择指定字符串的选项 void setCurrentText (const CString& str, bool must_exist=false) { int index = FindStringExact(0, str); if (index >= 0) { // 注意选项必须存在! SetCurSel(index); } else { SetCurSel(-1); } if (!must_exist) { SetWindowText(str); } }; template ::value>::type> void setCurrentNumberText(const T &val, bool must_exist = false) { CString str; str.Format(_T("%d"), val); int index = FindStringExact(0, str); if (index >= 0) { // 注意选项必须存在! SetCurSel(index); } else { SetCurSel(-1); } if (!must_exist) { SetWindowText(str); } }; template ::value>::type> int FindItemData(T val) { for (int index = 0; index < GetCount(); index++) { auto v = T(CComboBox::GetItemData(index)); if (val == v) { return index; } } return -1; } int FindItemDataPtr(void* ptr) { for (int index = 0; index < GetCount(); index++) { if (ptr == CComboBox::GetItemDataPtr(index)) { return index; } } return -1; } template ::value>::type> int SetCurSelByData(T val, bool clearifnotfound=true) { auto index = FindItemData(val); if (index >= 0) { SetCurSel(index); return index; } else { if (clearifnotfound) SetCurSel(-1); return CB_ERR; } } int SetCurSelByData(void* ptr, bool clearifnotfound=true) { auto index = FindItemDataPtr(ptr); if (index >= 0) { SetCurSel(index); return index; } else { if (clearifnotfound) SetCurSel(-1); return CB_ERR; } } uint32_t GetCurData() { auto index = GetCurSel(); ASSERT(index >= 0); return uint32_t(GetItemData(index)); } void * GetCurDataPtr() { auto index = GetCurSel(); ASSERT(index >= 0); return GetItemDataPtr(index); } }; // 不同基类特例化 template class _CKsComboBox; template class _CKsComboBox; typedef _CKsComboBox CKsComboBox; typedef _CKsComboBox CKsBCGPComboBox;