#pragma once template class CModifiedComboBoxT : public CComboBox { typedef std::list TParamList; public: // Constructors CModifiedComboBoxT(TParam defaultValue, HWND hWnd = nullptr, bool AllwaysSelected = true) : CComboBox(hWnd), m_Changed(false), m_Reset(false), m_defaultValue(defaultValue), m_BoldFont(nullptr), m_OriginalFont(nullptr), m_TextField(nullptr), m_AllwaysSelected(AllwaysSelected) { } ~CModifiedComboBoxT() { if (m_BoldFont) { DeleteObject(m_BoldFont); } for (TParamList::iterator iter = m_ParamList.begin(); iter != m_ParamList.end(); iter++) { TParam * Item = (TParam *)*iter; if (Item) { delete Item; } } } int AddItem(LPCTSTR strItem, const TParam & lParam) { int indx = AddString(strItem); TParam * Value = new TParam(lParam); SetItemData(indx, (DWORD_PTR)(Value)); m_ParamList.push_back(Value); if ((m_AllwaysSelected && GetCount() == 1) || m_defaultValue == lParam) { SetCurSel(indx); } return indx; } void SetReset(bool Reset) { m_Reset = Reset; if (m_Reset) { SetChanged(false); } } void SetChanged(bool Changed) { m_Changed = Changed; if (m_Changed) { SetReset(false); if (m_BoldFont == nullptr) { m_OriginalFont = (HFONT)SendMessage(WM_GETFONT); LOGFONT lfSystemVariableFont; GetObject(m_OriginalFont, sizeof(LOGFONT), &lfSystemVariableFont); lfSystemVariableFont.lfWeight = FW_BOLD; m_BoldFont = CreateFontIndirect(&lfSystemVariableFont); } SendMessage(WM_SETFONT, (WPARAM)m_BoldFont); InvalidateRect(nullptr); if (m_TextField) { ::SendMessage(m_TextField, WM_SETFONT, (WPARAM)m_BoldFont, 0); ::InvalidateRect(m_TextField, nullptr, true); } } else { if (m_OriginalFont) { SendMessage(WM_SETFONT, (WPARAM)m_OriginalFont); InvalidateRect(nullptr); if (m_TextField) { ::SendMessage(m_TextField, WM_SETFONT, (WPARAM)m_OriginalFont, 0); ::InvalidateRect(m_TextField, nullptr, true); } } } } void SetTextField(HWND hWnd) { if (m_TextField && m_OriginalFont) { ::SendMessage(m_TextField, WM_SETFONT, (WPARAM)m_OriginalFont, 0); } m_TextField = hWnd; if (m_Changed && m_BoldFont) { ::SendMessage(m_TextField, WM_SETFONT, (WPARAM)m_BoldFont, 0); } } inline void SetDefault(const TParam & defaultValue) { m_defaultValue = defaultValue; for (int i = 0, n = GetCount(); i < n; i++) { if (*((TParam *)GetItemData(i)) == m_defaultValue) { SetCurSel(i); break; } } } inline bool IsChanged(void) const { return m_Changed; } inline bool IsReset(void) const { return m_Reset; } private: CModifiedComboBoxT(void); CModifiedComboBoxT(const CModifiedComboBoxT &); CModifiedComboBoxT & operator=(const CModifiedComboBoxT &); bool m_Changed; bool m_Reset; TParam m_defaultValue; HFONT m_BoldFont; HFONT m_OriginalFont; HWND m_TextField; bool m_AllwaysSelected; TParamList m_ParamList; }; typedef CModifiedComboBoxT CModifiedComboBox; typedef CModifiedComboBoxT CModifiedComboBoxTxt;