PropertyGridItemEnum.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include "stdafx.h"
  2. #include "PropertyGridInplaceEdit.h"
  3. #include "PropertyGridInplaceButton.h"
  4. #include "PropertyGridInplaceList.h"
  5. #include "PropertyGridItem.h"
  6. #include "PropertyGridItemEnum.h"
  7. CPropertyGridItemEnum::CPropertyGridItemEnum(CString strCaption)
  8. : CPropertyGridItem(strCaption)
  9. {
  10. _Init();
  11. }
  12. CPropertyGridItemEnum::CPropertyGridItemEnum(UINT nID)
  13. : CPropertyGridItem(nID)
  14. {
  15. _Init();
  16. }
  17. CPropertyGridItemEnum::~CPropertyGridItemEnum()
  18. {
  19. }
  20. void CPropertyGridItemEnum::_Init()
  21. {
  22. SetFlags(pgitemHasComboButton); // 设置属性项不可编辑、有组合框
  23. m_pBindEnum = NULL;
  24. }
  25. void CPropertyGridItemEnum::AddEnumItem(int nItemValue, CString nItemText)
  26. {
  27. m_lstEnumItemValues.Add(nItemValue);
  28. GetConstraints()->AddConstraint(nItemText);
  29. }
  30. void CPropertyGridItemEnum::SetEnum(int value)
  31. {
  32. int count = (int)m_lstEnumItemValues.GetSize();
  33. ASSERT(count); // 设置属性值时,必须存在枚举数据项
  34. // 查找枚举值对应的列表索引
  35. int index;
  36. for (index = 0; index < count; index++)
  37. {
  38. if (m_lstEnumItemValues[index] == value)
  39. break;
  40. }
  41. // 如果没有找到,则设为第一个枚举数据
  42. if (index == count)
  43. index = 0;
  44. // 从属性项的下拉列表对象(派生自CStringList)获取指定枚举数据项的文本
  45. POSITION pos = GetConstraints()->FindIndex(index);
  46. ASSERT(pos);
  47. CPropertyGridItem::SetValue(GetConstraints()->GetAt(pos));
  48. if (m_pBindEnum)
  49. *m_pBindEnum = m_lstEnumItemValues[index];
  50. }
  51. int CPropertyGridItemEnum::GetEnum()
  52. {
  53. int index = GetConstraints()->FindConstraint( GetValue() );
  54. ASSERT(index != -1); // 获取属性值时,必须存在枚举数据项,且调用SetEnum设置了初值
  55. return m_lstEnumItemValues[index];
  56. }
  57. void CPropertyGridItemEnum::BindToEnum(int* pBindEnum)
  58. {
  59. m_pBindEnum = pBindEnum;
  60. if (m_pBindEnum)
  61. SetEnum(*m_pBindEnum);
  62. }
  63. void CPropertyGridItemEnum::SetValue(CString strValue)
  64. {
  65. CPropertyGridItem::SetValue(strValue);
  66. if (m_pBindEnum)
  67. *m_pBindEnum = GetEnum();
  68. }