a
This commit is contained in:
@@ -0,0 +1,281 @@
|
||||
// floatedit.cpp : implementation file
|
||||
//
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "geomative.h"
|
||||
#include "floatedit.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// CFloatEdit
|
||||
|
||||
CFloatEdit::CFloatEdit()
|
||||
{
|
||||
m_iIntLimitLen = 4;
|
||||
m_iDecLimitLen = 2;
|
||||
|
||||
m_bIsMinus = FALSE;
|
||||
}
|
||||
|
||||
CFloatEdit::~CFloatEdit()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
BEGIN_MESSAGE_MAP(CFloatEdit, CEdit)
|
||||
//{{AFX_MSG_MAP(CFloatEdit)
|
||||
ON_WM_CHAR()
|
||||
ON_CONTROL_REFLECT(EN_KILLFOCUS, OnKillfocus)
|
||||
ON_CONTROL_REFLECT(EN_SETFOCUS, OnSetfocus)
|
||||
ON_WM_KEYDOWN()
|
||||
//}}AFX_MSG_MAP
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// CFloatEdit message handlers
|
||||
|
||||
void CFloatEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
|
||||
{
|
||||
// TODO: Add your message handler code here and/or call default
|
||||
CString szText = _T("");
|
||||
int iLen = 0;
|
||||
int iIntLen = 0;
|
||||
int iDecLen = 0;
|
||||
|
||||
int iStartChar = 0;
|
||||
int iEndChar = 0;
|
||||
|
||||
int iMinus = 0;
|
||||
|
||||
GetWindowText(szText);
|
||||
iLen = szText.GetLength();
|
||||
|
||||
GetSel(iStartChar, iEndChar);
|
||||
|
||||
if ((FALSE == m_bIsMinus) && ('-' == nChar))
|
||||
{
|
||||
nChar = 0;
|
||||
}
|
||||
|
||||
if((nChar >= '0' && nChar <= '9' ) || ('.' == nChar) || ('-' == nChar))
|
||||
{
|
||||
iMinus = 0;
|
||||
|
||||
if ((szText.Left(1) != _T("-")) && ((iStartChar == iEndChar) && (0 == iStartChar)) && ('-' == nChar))
|
||||
{
|
||||
szText.Insert(0, (TCHAR)nChar);
|
||||
SetWindowText(szText);
|
||||
SetSel(1, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((szText.Left(1) == _T("-")) && ('-' == nChar))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (szText.Find("-") == 0)
|
||||
{
|
||||
iMinus = 1;
|
||||
}
|
||||
|
||||
if (szText.Find('.') < 0)
|
||||
{
|
||||
if ('.' == nChar)
|
||||
{
|
||||
if (iLen > 0)
|
||||
{
|
||||
szText = szText + '.';
|
||||
SetWindowText(szText);
|
||||
SetSel(iLen, ++iLen); //依据C++参数传递顺序,先执行++iLen,此时iLen等于iLen+1
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (iStartChar == iEndChar)
|
||||
{
|
||||
if (iLen < (m_iIntLimitLen + iMinus))
|
||||
{
|
||||
if (nChar != '-')
|
||||
{
|
||||
CEdit::OnChar(nChar, nRepCnt, nFlags);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CEdit::OnChar(nChar, nRepCnt, nFlags);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
iIntLen = szText.Find('.') - iMinus;
|
||||
iDecLen = iLen - szText.Find('.') - 1;
|
||||
|
||||
if ('.' != nChar)
|
||||
{
|
||||
/*
|
||||
if ((iStartChar == iEndChar) && (iStartChar > iIntLen) && (iDecLen < m_iDecLimitLen)) //控制小数位长度
|
||||
{
|
||||
CEdit::OnChar(nChar, nRepCnt, nFlags);
|
||||
}
|
||||
|
||||
if ((iStartChar == iEndChar) && (iStartChar <= iIntLen) && (iIntLen < m_iIntLimitLen)) //控制整数位长度
|
||||
{
|
||||
CEdit::OnChar(nChar, nRepCnt, nFlags);
|
||||
}
|
||||
*/
|
||||
if (iStartChar == iEndChar)
|
||||
{
|
||||
if (iStartChar > iIntLen)
|
||||
{
|
||||
if (iDecLen < m_iDecLimitLen) //控制小数位长度
|
||||
{
|
||||
CEdit::OnChar(nChar, nRepCnt, nFlags);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (iIntLen < (m_iIntLimitLen)) //控制整数位长度
|
||||
{
|
||||
CEdit::OnChar(nChar, nRepCnt, nFlags);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CEdit::OnChar(nChar, nRepCnt, nFlags);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (0x0008 == nChar) //VK_BACK == 0x0008
|
||||
{
|
||||
if (szText.Find('.') >= 0)
|
||||
{
|
||||
iIntLen = szText.Find('.');
|
||||
iDecLen = iLen - szText.Find('.') - 1;
|
||||
|
||||
if ((iIntLen + 1) == iStartChar)
|
||||
{
|
||||
szText = szText.Left(iIntLen);
|
||||
SetWindowText(szText);
|
||||
|
||||
iLen = szText.GetLength();
|
||||
SetSel(iLen, ++iLen);
|
||||
return;
|
||||
}
|
||||
}
|
||||
CEdit::OnChar(nChar, nRepCnt, nFlags);
|
||||
}
|
||||
}
|
||||
|
||||
void CFloatEdit::OnKillfocus()
|
||||
{
|
||||
// TODO: Add your control notification handler code here
|
||||
CString szText = _T("");
|
||||
int iLen = (int)VAL_ZERO;
|
||||
int iIntLen = (int)VAL_ZERO;
|
||||
|
||||
GetWindowText(szText);
|
||||
|
||||
if ((szText.GetLength() > (int)VAL_ZERO) && (float)VAL_ZERO == atof(szText))
|
||||
{
|
||||
szText = _T("0");
|
||||
// SetWindowText(szText);
|
||||
// return;
|
||||
}
|
||||
else
|
||||
{
|
||||
szText.TrimLeft('0');
|
||||
// szText.TrimRight('0');
|
||||
}
|
||||
|
||||
iLen = szText.GetLength();
|
||||
|
||||
if ((iLen - 1) == szText.Find('.'))
|
||||
{
|
||||
szText.Delete(--iLen, 1);
|
||||
}
|
||||
|
||||
iIntLen = szText.Find('.');
|
||||
if (0 == iIntLen)
|
||||
{
|
||||
szText = '0' + szText;
|
||||
SetSel(iLen, ++iLen);
|
||||
}
|
||||
SetWindowText(szText);
|
||||
}
|
||||
|
||||
void CFloatEdit::SetIntLimitLen(int iIntLimitLen)
|
||||
{
|
||||
this->m_iIntLimitLen = iIntLimitLen;
|
||||
}
|
||||
|
||||
void CFloatEdit::SetDecLimitLen(int iDecLimitLen)
|
||||
{
|
||||
this->m_iDecLimitLen = iDecLimitLen;
|
||||
}
|
||||
|
||||
void CFloatEdit::SetIsMinus(BOOL bIsMinus)
|
||||
{
|
||||
this->m_bIsMinus = bIsMinus;
|
||||
}
|
||||
|
||||
void CFloatEdit::OnSetfocus()
|
||||
{
|
||||
// TODO: Add your control notification handler code here
|
||||
CString szText = _T("");
|
||||
int iLen = 0;
|
||||
|
||||
GetWindowText(szText);
|
||||
iLen = szText.GetLength();
|
||||
SetSel(iLen, ++iLen);
|
||||
}
|
||||
|
||||
void CFloatEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
|
||||
{
|
||||
// TODO: Add your message handler code here and/or call default
|
||||
|
||||
CString szText = _T("");
|
||||
int iLen = 0;
|
||||
int iIntLen = 0;
|
||||
int iDecLen = 0;
|
||||
|
||||
int iStartChar = 0;
|
||||
int iEndChar = 0;
|
||||
|
||||
GetWindowText(szText);
|
||||
iLen = szText.GetLength();
|
||||
|
||||
GetSel(iStartChar, iEndChar);
|
||||
if (0x002E == nChar) //VK_DELETE == 0x002E
|
||||
{
|
||||
if (szText.Find('.') >= 0)
|
||||
{
|
||||
iIntLen = szText.Find('.');
|
||||
iDecLen = iLen - szText.Find('.') - 1;
|
||||
|
||||
if (iIntLen == iStartChar)
|
||||
{
|
||||
szText = szText.Left(iIntLen);
|
||||
SetWindowText(szText);
|
||||
|
||||
iLen = szText.GetLength();
|
||||
SetSel(iLen, ++iLen);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
|
||||
}
|
||||
Reference in New Issue
Block a user