HOWTO: DDX - DDV for 64-bit numbersLast reviewed: July 2, 1997Article ID: Q169947 |
The information in this article applies to:
SUMMARYDDX - DDV functions in MFC do not directly support the __int64 type. However, you can add your own functions to allow 64-bit numbers to be used with Edit controls.
MORE INFORMATIONBelow is sample code for will DDX - DDV routines to handle the __int64 type. This code can be easily modified to handle unsigned 64-bit numbers. This code uses the TCHAR datatype for text so it will work with unicode or standard character types without modification.
Sample Code
// First we have to fix a bug in TCHAR.H.
// _ttoi64 is incorrectly defined in TCHAR.H, so we need to undefine it
// and redefine it correctly to avoid the compile error when building
// and non-unicode version.
#ifdef _UNICODE
#ifdef _ttoi64
#undef _ttoi64
#define _ttoi64 _wtoi64
#endif
#else
#ifdef _ttoi64
#undef _ttoi64
#define _ttoi64 _atoi64
#endif
#endif
//----------------------------------------------------------------------
// Use _ttoi64 and _i64tot to get the data into and out of the
// the member variables. These map to _atoi64 /_wtoi64 and
// _i64toa / _i64tow.
//
void DDX_I64Txt( CDataExchange* pDX,
int nIDC,
__int64& nValue
)
{
TCHAR szBuffer[32];
HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
if (pDX->m_bSaveAndValidate)
{ // _int64 is 19 characters long
*szBuffer = NULL; // when converted to text.
::GetWindowText( hWndCtrl, szBuffer, 30 );
nValue = _ttoi64( szBuffer );
}
else
{
_tcscpy( szBuffer, _i64tot( nValue, szBuffer, 10 ) );
::SetWindowText( hWndCtrl, szBuffer );
}
} // end DDX_I64Txt
//--------------------------------------------------------
// Most DDV functions pass nValue by value. We pass a reference
// here so we can set the value to the min or max specified if
// an out-of-range value is passed in.
//
void DDV_MinMaxI64( CDataExchange* pDX,
__int64& nValue,
__int64 nMinVal,
__int64 nMaxVal
)
{
ASSERT( nMinVal <= nMaxVal);
if( !pDX->m_bSaveAndValidate )
{
TRACE0("Warning: initial dialog data is out of range.\n");
return;
}
if( (nValue < nMinVal) || (nValue > nMaxVal) )
{
TCHAR szMinStr[32]; // Have to use strings here because
TCHAR szMaxStr[32]; // CString and sprintf formatting
TCHAR szMsgStr[64]; // don't support 64-bit numbers.
_i64tot( nMinVal, szMinStr, 10 );
_i64tot( nMaxVal, szMaxStr, 10 );
_stprintf( szMsgStr, "Enter a value between %s and %s\n",
szMinStr, szMaxStr );
AfxMessageBox( szMsgStr, MB_ICONEXCLAMATION );
// Set the value to something defined
(nValue < nMinVal) ? nValue = nMinVal : nValue = nMaxVal;
pDX->Fail(); // Restores focus to the
// offending control and throws
} // a user exception.
} // End DDV_MinMaxI64.
|
Keywords : MfcUI
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |