home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c480 / 19.ddi / MFC / SRC / DLGFLOAT.CP_ / DLGFLOAT.CP
Encoding:
Text File  |  1993-02-08  |  3.5 KB  |  124 lines

  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992 Microsoft Corporation
  3. // All rights reserved.
  4.  
  5. // This source code is only intended as a supplement to the 
  6. // Microsoft Foundation Classes Reference and Microsoft 
  7. // QuickHelp and/or WinHelp documentation provided with the library. 
  8. // See these sources for detailed information regarding the 
  9. // Microsoft Foundation Classes product. 
  10.  
  11. #include "stdafx.h"
  12. #include <float.h>              // floating point precision
  13.  
  14. #ifdef AFX_CORE3_SEG
  15. #pragma code_seg(AFX_CORE3_SEG)
  16. #endif
  17.  
  18. #ifdef _DEBUG
  19. #undef THIS_FILE
  20. static char BASED_CODE THIS_FILE[] = __FILE__;
  21. #endif
  22.  
  23. /////////////////////////////////////////////////////////////////////////////
  24. // Extra data validation procs for float/double support
  25. //  see "dlgdata.cpp" for non-floating point support
  26. /////////////////////////////////////////////////////////////////////////////
  27.  
  28. static BOOL PASCAL NEAR _AfxSimpleFloatParse(const char* pszText, double& d)
  29. {
  30.     ASSERT(pszText != NULL);
  31.     while (*pszText == ' ' || *pszText == '\t')
  32.         pszText++;
  33.     char chFirst = pszText[0];
  34.     d = strtod(pszText, (char**)&pszText);
  35.     if (d == 0.0 && chFirst != '0')
  36.         return FALSE;   // could not convert
  37.     while (*pszText == ' ' || *pszText == '\t')
  38.         pszText++;
  39.     if (*pszText != '\0')
  40.         return FALSE;   // not terminated properly
  41.  
  42.     return TRUE;
  43. }
  44.  
  45.  
  46. static void PASCAL NEAR DDX_TextFloatFormat(CDataExchange* pDX, int nIDC,
  47.     void* pData, double value, int nSizeGcvt)
  48. {
  49.     ASSERT(pData != NULL);
  50.  
  51.     HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
  52.     char szT[64];
  53.     if (pDX->m_bSaveAndValidate)
  54.     {
  55.         ::GetWindowText(hWndCtrl, szT, sizeof(szT));
  56.         double d;
  57.         if (!_AfxSimpleFloatParse(szT, d))
  58.         {
  59.             AfxMessageBox(AFX_IDP_PARSE_REAL);
  60.             pDX->Fail();            // throws exception
  61.         }
  62.         if (nSizeGcvt == FLT_DIG)
  63.             *((float*)pData) = (float)d;
  64.         else
  65.             *((double*)pData) = d;
  66.     }
  67.     else
  68.     {
  69.         _gcvt(value, nSizeGcvt, szT);
  70.         _AfxSmartSetWindowText(hWndCtrl, szT);
  71.     }
  72. }
  73.  
  74.  
  75. void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, float& value)
  76. {
  77.     DDX_TextFloatFormat(pDX, nIDC, &value, value, FLT_DIG);
  78. }
  79.  
  80. void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, double& value)
  81. {
  82.     DDX_TextFloatFormat(pDX, nIDC, &value, value, DBL_DIG);
  83. }
  84.  
  85. /////////////////////////////////////////////////////////////////////////////
  86. // Validation procs
  87.  
  88. static void NEAR PASCAL FailMinMaxReal(CDataExchange* pDX,
  89.      double minVal, double maxVal, int precision, UINT nIDPrompt)
  90.     // error string must have '%1' and '%2' in it
  91. {
  92.     if (!pDX->m_bSaveAndValidate)
  93.     {
  94.         TRACE0("Warning: initial dialog data is out of range\n");
  95.         return;         // don't stop now
  96.     }
  97.     char szMin[32], szMax[32];
  98.     CString prompt;
  99.     AfxFormatString2(prompt, nIDPrompt,
  100.         _gcvt(minVal, precision, szMin),
  101.         _gcvt(maxVal, precision, szMax));
  102.     AfxMessageBox(prompt, MB_ICONEXCLAMATION, nIDPrompt);
  103.     prompt.Empty(); // exception prep
  104.     pDX->Fail();
  105. }
  106.  
  107. void AFXAPI DDV_MinMaxFloat(CDataExchange* pDX, float const& value, float minVal, float maxVal)
  108. {
  109.     ASSERT(minVal <= maxVal);
  110.     if (value < minVal || value > maxVal)
  111.         FailMinMaxReal(pDX, (double)minVal, (double)maxVal, FLT_DIG,
  112.             AFX_IDP_PARSE_REAL_RANGE);
  113. }
  114.  
  115. void AFXAPI DDV_MinMaxDouble(CDataExchange* pDX, double const& value, double minVal, double maxVal)
  116. {
  117.     ASSERT(minVal <= maxVal);
  118.     if (value < minVal || value > maxVal)
  119.         FailMinMaxReal(pDX, (double)minVal, (double)maxVal, DBL_DIG,
  120.             AFX_IDP_PARSE_REAL_RANGE);
  121. }
  122.  
  123. /////////////////////////////////////////////////////////////////////////////
  124.