131 lines
3.4 KiB
C++
131 lines
3.4 KiB
C++
// paredit.cpp: C++ derived edit control for numbers/letters etc
|
|
//
|
|
// This is a part of the Microsoft Foundation Classes C++ library.
|
|
// Copyright (C) 1992-1998 Microsoft Corporation
|
|
// All rights reserved.
|
|
//
|
|
// This source code is only intended as a supplement to the
|
|
// Microsoft Foundation Classes Reference and related
|
|
// electronic documentation provided with the library.
|
|
// See these sources for detailed information regarding the
|
|
// Microsoft Foundation Classes product.
|
|
|
|
#include "stdafx.h"
|
|
#include "ctrltest.h"
|
|
|
|
#include "paredit.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// ParsedEdit
|
|
|
|
CParsedEdit::CParsedEdit()
|
|
{
|
|
m_wParseStyle = 0;
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CParsedEdit, CEdit)
|
|
//{{AFX_MSG_MAP(CParsedEdit)
|
|
ON_WM_CHAR()
|
|
ON_WM_VSCROLL() // for associated spin controls
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Creating from C++ code
|
|
|
|
BOOL CParsedEdit::Create(DWORD dwStyle, const RECT& rect,
|
|
CWnd* pParentWnd, UINT nID)
|
|
{
|
|
m_wParseStyle = LOWORD(dwStyle);
|
|
// figure out edit control style
|
|
DWORD dwEditStyle = MAKELONG(ES_LEFT, HIWORD(dwStyle));
|
|
return CWnd::Create(_T("EDIT"), NULL, dwEditStyle, rect, pParentWnd, nID);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Aliasing on top of an existing Edit control
|
|
|
|
BOOL CParsedEdit::SubclassEdit(UINT nID, CWnd* pParent, WORD wParseStyle)
|
|
{
|
|
m_wParseStyle = wParseStyle;
|
|
return SubclassDlgItem(nID, pParent);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Input character filter
|
|
|
|
void CParsedEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
WORD type;
|
|
|
|
if (nChar < 0x20)
|
|
type = PES_ALL; // always allow control chars
|
|
else if (IsCharAlphaNumeric((TCHAR)nChar) && !IsCharAlpha((TCHAR)nChar))
|
|
type = PES_NUMBERS;
|
|
else if (IsCharAlpha((TCHAR)nChar))
|
|
type = PES_LETTERS;
|
|
else
|
|
type = PES_OTHERCHARS;
|
|
|
|
if (m_wParseStyle & type)
|
|
{
|
|
CEdit::OnChar(nChar, nRepCnt, nFlags); // permitted
|
|
}
|
|
else
|
|
{
|
|
// illegal character - inform parent
|
|
OnBadInput();
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Spin controls will send scroll messages
|
|
|
|
void CParsedEdit::OnVScroll(UINT nSBCode, UINT, CScrollBar*)
|
|
{
|
|
int nDelta = 0;
|
|
if (nSBCode == SB_LINEDOWN)
|
|
nDelta = -1;
|
|
else if (nSBCode == SB_LINEUP)
|
|
nDelta = +1;
|
|
else
|
|
return; // nothing special
|
|
|
|
// set the focus to this edit item and select it all
|
|
SetFocus();
|
|
|
|
//Get the number in the control.
|
|
BOOL bOk;
|
|
int nOld = GetParent()->GetDlgItemInt(GetDlgCtrlID(), &bOk);
|
|
if (bOk)
|
|
{
|
|
// The MuScrl32 control also supports range checking
|
|
// for this example, we just prevent overflow
|
|
int nNew = nOld + nDelta;
|
|
if (nNew >= 0 && nNew <= 32767)
|
|
GetParent()->SetDlgItemInt(GetDlgCtrlID(), nNew);
|
|
else
|
|
bOk = FALSE;
|
|
}
|
|
|
|
if (!bOk)
|
|
OnBadInput();
|
|
SetSel(0, -1);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// default bad input handler, beep (unless parent notification
|
|
// returns -1. Most parent dialogs will return 0 or 1 for command
|
|
// handlers (i.e. Beep is the default)
|
|
|
|
void CParsedEdit::OnBadInput()
|
|
{
|
|
if (GetParent()->SendMessage(WM_COMMAND,
|
|
MAKELONG(GetDlgCtrlID(), PEN_ILLEGALCHAR), (LPARAM)m_hWnd) != -1)
|
|
{
|
|
MessageBeep((UINT)-1);
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|