185 lines
4.2 KiB
C++
185 lines
4.2 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 1996 Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
// DDxDDv.cpp
|
|
//
|
|
// Abstract:
|
|
// Implementation of custom dialog data exchange/dialog data validation
|
|
// routines.
|
|
//
|
|
// Author:
|
|
// David Potter (davidp) September 5, 1996
|
|
//
|
|
// Revision History:
|
|
//
|
|
// Notes:
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "DDxDDv.h"
|
|
|
|
#include "resource.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// DDX_Number
|
|
//
|
|
// Routine Description:
|
|
// Do data exchange between the dialog and the class.
|
|
//
|
|
// Arguments:
|
|
// pDX [IN OUT] Data exchange object
|
|
// nIDC [IN] Control ID.
|
|
// dwValue [IN OUT] Value to set or get.
|
|
// dwMin [IN] Minimum value.
|
|
// dwMax [IN] Maximum value.
|
|
// bSigned [IN] TRUE = value is signed, FALSE = value is unsigned
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void AFXAPI DDX_Number(
|
|
IN OUT CDataExchange * pDX,
|
|
IN int nIDC,
|
|
IN OUT DWORD & rdwValue,
|
|
IN DWORD dwMin,
|
|
IN DWORD dwMax,
|
|
IN BOOL bSigned
|
|
)
|
|
{
|
|
HWND hwndCtrl;
|
|
DWORD dwValue;
|
|
|
|
ASSERT(pDX != NULL);
|
|
ASSERT(dwMin < dwMax);
|
|
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
|
|
// Get the control window handle.
|
|
hwndCtrl = pDX->PrepareEditCtrl(nIDC);
|
|
|
|
if (pDX->m_bSaveAndValidate)
|
|
{
|
|
BOOL bTranslated;
|
|
|
|
dwValue = GetDlgItemInt(pDX->m_pDlgWnd->m_hWnd, nIDC, &bTranslated, bSigned);
|
|
if (!bTranslated
|
|
|| (dwValue < dwMin)
|
|
|| (dwValue > dwMax)
|
|
)
|
|
{
|
|
TCHAR szMin[32];
|
|
TCHAR szMax[32];
|
|
CString strPrompt;
|
|
|
|
wsprintf(szMin, _T("%lu%"), dwMin);
|
|
wsprintf(szMax, _T("%lu%"), dwMax);
|
|
AfxFormatString2(strPrompt, AFX_IDP_PARSE_INT_RANGE, szMin, szMax);
|
|
AfxMessageBox(strPrompt, MB_ICONEXCLAMATION, AFX_IDP_PARSE_INT_RANGE);
|
|
strPrompt.Empty(); // exception prep
|
|
pDX->Fail();
|
|
} // if: invalid string
|
|
else
|
|
rdwValue = dwValue;
|
|
} // if: saving data
|
|
else
|
|
{
|
|
CString strMaxValue;
|
|
|
|
// Set the maximum number of characters that can be entered.
|
|
if (bSigned)
|
|
strMaxValue.Format(_T("%ld"), dwMax);
|
|
else
|
|
strMaxValue.Format(_T("%lu"), dwMax);
|
|
SendMessage(hwndCtrl, EM_LIMITTEXT, strMaxValue.GetLength(), 0);
|
|
|
|
// Set the value into the control.
|
|
DDX_Text(pDX, nIDC, rdwValue);
|
|
} // else: setting data onto the dialog
|
|
|
|
} //*** DDX_Number()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// DDV_RequiredText
|
|
//
|
|
// Routine Description:
|
|
// Validate that the dialog string is present.
|
|
//
|
|
// Arguments:
|
|
// pDX [IN OUT] Data exchange object
|
|
// nIDC [IN] Control ID.
|
|
// nIDCLabel [IN] Label control ID.
|
|
// rstrValue [IN] Value to set or get.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void AFXAPI DDV_RequiredText(
|
|
IN OUT CDataExchange * pDX,
|
|
IN int nIDC,
|
|
IN int nIDCLabel,
|
|
IN const CString & rstrValue
|
|
)
|
|
{
|
|
ASSERT(pDX != NULL);
|
|
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
|
|
if (pDX->m_bSaveAndValidate)
|
|
{
|
|
if (rstrValue.GetLength() == 0)
|
|
{
|
|
HWND hwndLabel;
|
|
TCHAR szLabel[1024];
|
|
TCHAR szStrippedLabel[1024];
|
|
int iSrc;
|
|
int iDst;
|
|
TCHAR ch;
|
|
CString strPrompt;
|
|
|
|
// Get the label window handle
|
|
hwndLabel = pDX->PrepareEditCtrl(nIDCLabel);
|
|
|
|
// Get the text of the label.
|
|
GetWindowText(hwndLabel, szLabel, sizeof(szLabel) / sizeof(TCHAR));
|
|
|
|
// Remove ampersands (&) and colons (:).
|
|
for (iSrc = 0, iDst = 0 ; szLabel[iSrc] != _T('\0') ; iSrc++)
|
|
{
|
|
ch = szLabel[iSrc];
|
|
if ((ch != _T('&')) && (ch != _T(':')))
|
|
szStrippedLabel[iDst++] = ch;
|
|
} // for: each character in the label
|
|
szStrippedLabel[iDst] = _T('\0');
|
|
|
|
// Format and display a message.
|
|
strPrompt.FormatMessage(IDS_REQUIRED_FIELD_EMPTY, szStrippedLabel);
|
|
AfxMessageBox(strPrompt, MB_ICONEXCLAMATION);
|
|
|
|
// Do this so that the control receives focus.
|
|
(void) pDX->PrepareEditCtrl(nIDC);
|
|
|
|
// Fail the call.
|
|
strPrompt.Empty(); // exception prep
|
|
pDX->Fail();
|
|
} // if: field not specified
|
|
} // if: saving data
|
|
|
|
} //*** DDV_RequiredText()
|