NumEdit.cpp
上传用户:sz81710966
上传日期:2013-03-01
资源大小:409k
文件大小:3k
源码类别:

多国语言处理

开发平台:

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 = MINRANGE;
  19. m_MaxValue = MAXRANGE;
  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. NUMSTYLE CNumEdit::GetValue() const
  33. {
  34. float f = 0.0f;
  35. if (IsValid() == VALID)
  36. {
  37. CString str;
  38. GetWindowText(str);
  39. swscanf((TCHAR *)(LPCTSTR)str, _T("%f"), &f);
  40. }
  41. return (NUMSTYLE)f;
  42. }
  43. BOOL CNumEdit::SetValue(NUMSTYLE val)
  44. {
  45. if (val > m_MaxValue || val < m_MinValue)
  46. return FALSE;
  47. CString str, s;
  48. str.Format(ConstructFormat(s, val), val);
  49. SetWindowText(str);
  50. return TRUE;
  51. }
  52. int CNumEdit::IsValid() const
  53. {
  54. CString str;
  55. GetWindowText(str);
  56. int res = VALID;
  57. float f;
  58. TCHAR lp[10];
  59. if (swscanf((TCHAR *)(LPCTSTR)str, _T("%f%s"), &f, lp) != 1) 
  60. res = INVALID_CHAR;
  61. if (f > m_MaxValue || f < m_MinValue) 
  62. res = OUT_OF_RANGE;
  63. if (m_Verbose && res != VALID)
  64. {
  65. str.Empty();
  66. if (res & OUT_OF_RANGE) 
  67. str += _T("Given value is out of range.n");
  68. if (res & INVALID_CHAR) 
  69. str += _T("Characters must be a number.n");
  70. AfxMessageBox(str, MB_OK | MB_ICONSTOP);
  71. }
  72. return res;
  73. }
  74. int CNumEdit::IsValid(const CString &str) const
  75. {
  76. int res = VALID;
  77. NUMSTYLE f;
  78. char lp[10];
  79. if (swscanf((TCHAR *)(LPCTSTR)str, _T("%f%s"), &f, lp) != 1)
  80. res = INVALID_CHAR;
  81. if (f > m_MaxValue && f < m_MinValue)
  82. res = OUT_OF_RANGE;
  83. if (m_Verbose && res != VALID)
  84. {
  85. CString msg;
  86. msg.Empty();
  87. if (res & OUT_OF_RANGE) 
  88. msg += _T("Given value is out of range.n");
  89. if (res & INVALID_CHAR) 
  90. msg += _T("Characters must be a number.n");
  91. AfxMessageBox(str, MB_OK | MB_ICONSTOP);
  92. }
  93. return res;
  94. }
  95. void CNumEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
  96. {
  97. if (nChar == ' ') 
  98. return;
  99. NUMSTYLE oldValue = GetValue();
  100. CEdit::OnChar(nChar, nRepCnt, nFlags);
  101. if (IsValid() != VALID)
  102. {
  103. SetValue(oldValue);
  104. SetSel(0, -1);
  105. MSG msg;
  106. while (::PeekMessage(&msg, m_hWnd, WM_CHAR, WM_CHAR, PM_REMOVE));
  107. }
  108. else
  109. {
  110. CString s;
  111. ConstructFormat(s, GetValue());
  112. }
  113. }
  114. BOOL CNumEdit::Verbose() const
  115. {
  116. return m_Verbose;
  117. }
  118. void CNumEdit::Verbose(BOOL v)
  119. {
  120. m_Verbose = v;
  121. }
  122. void CNumEdit::SetRange(NUMSTYLE min, NUMSTYLE max)
  123. {
  124. m_MinValue = min;
  125. m_MaxValue = max;
  126. }
  127. void CNumEdit::GetRange(NUMSTYLE min, NUMSTYLE max) const
  128. {
  129. min = m_MinValue;
  130. max = m_MaxValue;
  131. }
  132. void CNumEdit::SetDelta(NUMSTYLE delta)
  133. {
  134. m_Delta = delta;
  135. }
  136. NUMSTYLE CNumEdit::GetDelta()
  137. {
  138. return m_Delta;
  139. }
  140. void CNumEdit::ChangeAmount(int step)
  141. {
  142. NUMSTYLE f = GetValue() + step * m_Delta;
  143. if (f > m_MaxValue)
  144. f = m_MaxValue;
  145. else if (f < m_MinValue)
  146. f = m_MinValue;
  147. SetValue(f);
  148. }
  149. CString& CNumEdit::ConstructFormat(CString &str, NUMSTYLE num)
  150. {
  151. str.Format(_T("%d"),num);
  152. return str;
  153. }