NumEdit.cpp
上传用户:jiyingjie
上传日期:2007-01-02
资源大小:16k
文件大小:4k
源码类别:

编辑框

开发平台:

Visual C++

  1. // NumEdit.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "NumEdit.h"
  5. #include "Float.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CNumEdit
  13. IMPLEMENT_DYNAMIC(CNumEdit, CEdit)
  14. CNumEdit::CNumEdit()
  15. {
  16. m_NumberOfNumberAfterPoint = 0;
  17. m_Verbose = FALSE;
  18. m_MinValue = -FLT_MAX;
  19. m_MaxValue = FLT_MAX;
  20. m_Delta = FLT_ROUNDS;
  21. }
  22. CNumEdit::~CNumEdit()
  23. {
  24. }
  25. BEGIN_MESSAGE_MAP(CNumEdit, CEdit)
  26. //{{AFX_MSG_MAP(CNumEdit)
  27. ON_WM_CHAR()
  28. //}}AFX_MSG_MAP
  29. END_MESSAGE_MAP()
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CNumEdit message handlers
  32. float CNumEdit::GetValue() const
  33. {
  34. float f = m_MinValue;
  35. if (IsValid() == VALID)
  36. {
  37. CString str;
  38. GetWindowText(str);
  39. sscanf(str, "%f", &f);
  40. }
  41. return f;
  42. }
  43. BOOL CNumEdit::SetValue(float val)
  44. {
  45. if (val > m_MaxValue || val < m_MinValue) return FALSE;
  46. CString str, s;
  47. str.Format(ConstructFormat(s, val), val);
  48. SetWindowText(str);
  49. return TRUE;
  50. }
  51. int CNumEdit::IsValid() const
  52. {
  53. CString str;
  54. GetWindowText(str);
  55. int res = VALID;
  56. float f;
  57. char lp[10];
  58. if ((str.GetLength() == 1) && ((str[0] == '+') || (str[0] == '-'))) res = MINUS_PLUS;
  59. else
  60. if (sscanf(str, "%f%s", &f, lp) != 1) res = INVALID_CHAR;
  61. else
  62. if (f > m_MaxValue || f < m_MinValue) res = OUT_OF_RANGE;
  63. if (m_Verbose && (res != VALID) && (res != MINUS_PLUS))
  64. {
  65. str.Empty();
  66. if (res & OUT_OF_RANGE) str += _T("Given value is out of range.n");
  67. if (res & INVALID_CHAR) str += _T("Characters must be a number.n");
  68. AfxMessageBox(str, MB_OK | MB_ICONSTOP);
  69. }
  70. return res;
  71. }
  72. int CNumEdit::IsValid(const CString &str) const
  73. {
  74. int res = VALID;
  75. float f;
  76. char lp[10];
  77. if ((str.GetLength() == 1) && ((str[0] == '+') || (str[0] == '-'))) res = MINUS_PLUS;
  78. else if (sscanf(str, "%f%s", &f, lp) != 1) res = INVALID_CHAR;
  79. else if (f > m_MaxValue || f < m_MinValue) res = OUT_OF_RANGE;
  80. if (m_Verbose && (res != VALID) && (res != MINUS_PLUS))
  81. {
  82. CString msg;
  83. msg.Empty();
  84. if (res & OUT_OF_RANGE) msg += _T("Given value is out of range.n");
  85. if (res & INVALID_CHAR) msg += _T("Characters must be a number.n");
  86. AfxMessageBox(str, MB_OK | MB_ICONSTOP);
  87. }
  88. return res;
  89. }
  90. void CNumEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
  91. {
  92. if (nChar == ' ') return;
  93. float oldValue;
  94. oldValue = GetValue();
  95. CEdit::OnChar(nChar, nRepCnt, nFlags);
  96. int val = IsValid();
  97. CString s;
  98. switch (val)
  99. {
  100. case VALID:
  101. ConstructFormat(s, GetValue());
  102. break;
  103. case MINUS_PLUS: break;
  104. default:
  105. SetValue(oldValue);
  106. SetSel(0, -1);
  107. MSG msg;
  108. while (::PeekMessage(&msg, m_hWnd, WM_CHAR, WM_CHAR, PM_REMOVE));
  109. break;
  110. }
  111. }
  112. BOOL CNumEdit::Verbose() const
  113. {
  114. return m_Verbose;
  115. }
  116. void CNumEdit::Verbose(BOOL v)
  117. {
  118. m_Verbose = v;
  119. }
  120. void CNumEdit::SetRange(float min, float max)
  121. {
  122. m_MinValue = min;
  123. m_MaxValue = max;
  124. }
  125. void CNumEdit::GetRange(float & min, float & max) const
  126. {
  127. min = m_MinValue;
  128. max = m_MaxValue;
  129. }
  130. void CNumEdit::SetDelta(float delta)
  131. {
  132. m_Delta = delta;
  133. }
  134. float CNumEdit::GetDelta()
  135. {
  136. return m_Delta;
  137. }
  138. void CNumEdit::ChangeAmount(int step)
  139. {
  140. float f = GetValue() + step * m_Delta;
  141. if (f > m_MaxValue) f = m_MaxValue;
  142. else if (f < m_MinValue) f = m_MinValue;
  143. SetValue(f);
  144. }
  145. CString& CNumEdit::ConstructFormat(CString &str, float num)
  146. {
  147. str.Format("%G", num);
  148. int n = str.Find('.');
  149. if (n >= 0)
  150. {
  151. n = str.GetLength() - n - 1;
  152. if (n > m_NumberOfNumberAfterPoint) m_NumberOfNumberAfterPoint = n;
  153. }
  154. str.Format("%%.%df", m_NumberOfNumberAfterPoint);
  155. return str;
  156. }