📄 numberedit.cpp
字号:
{
if(nStart == nClose) return;
else if(nChar == '-') return;
}
// 负号问题
if(nChar == '-' || nChar == '+')
{
if( m_bNegative )
{
// 负号变成正号
if(m_lpText[0] == '-')
{
XDeleteChar(m_lpText, 0);
SetWindowText(m_lpText);
// 设置新的位置
if(nStart > 0) nStart --;
if(nClose > 0) nClose --;
SetSel(nStart, nClose);
}
else // 正号变成负号
{
XInsertChar(m_lpText, 0, '-');
SetWindowText(m_lpText);
// 设置新的位置
nStart ++; nClose ++;
SetSel(nStart, nClose);
}
}
return;
}
// 小数点的位置
int nPoint = nTemp - (m_nDecimal + 1);
// 根据字符,分类分析
if(nChar == 0x08) // 回删
{
// 删除选中部分
if(nClose > nStart)
{
// 小数点后面部分
if(nStart > nPoint) nTemp = nStart;
else nTemp = nPoint + 1;
if(nClose > nTemp)
XCleanStr(m_lpText, nTemp, nClose);
// 小数点前面部分
if(nClose < nPoint) nTemp = nClose;
else nTemp = nPoint;
if(nStart < nTemp)
{
XDeleteStr(m_lpText, nStart, nTemp);
nPoint -= (nTemp - nStart);
}
nClose = nStart;
}
else
{
if(nStart == 0) return;
// 如果是逗号或小数点
nStart --; nClose --;
if( m_lpText[nStart] == ',' ||
m_lpText[nStart] == '.' )
{
SetSel(nStart, nStart);
return;
}
// 回删单个字符
if(nStart > nPoint)
m_lpText[nStart] = 0x30;
else
XDeleteChar(m_lpText, nStart);
}
// 设置当前文本
SetWindowText(m_lpText);
SetSel(nStart, nStart);
}
else if(nChar == 0x0e) // 删除
{
// 删除选中部分
if(nClose > nStart)
{
// 小数点后面部分
if(nStart > nPoint) nTemp = nStart;
else nTemp = nPoint + 1;
if(nClose > nTemp)
XCleanStr(m_lpText, nTemp, nClose);
// 小数点前面部分
if(nClose < nPoint) nTemp = nClose;
else nTemp = nPoint;
if(nStart < nTemp)
{
XDeleteStr(m_lpText, nStart, nTemp);
nPoint -= (nTemp - nStart);
}
nClose = nStart;
}
else
{
if(m_lpText[nStart] == 0x00) return;
// 如果是逗号或小数点
if( m_lpText[nStart] == ',' ||
m_lpText[nStart] == '.' )
{
nStart ++; nClose ++;
SetSel(nStart, nStart);
return;
}
// 删除单个字符
if(nStart < nPoint)
XDeleteChar(m_lpText, nStart);
else
{
m_lpText[nStart] = 0x30;
nStart ++; nClose ++;
}
}
// 设置当前文本
SetWindowText(m_lpText);
SetSel(nStart, nStart);
}
else if(nChar == '.') // 小数点
{
// 查找小数点的位置
nStart = nPoint + 1;
SetSel(nStart, nStart);
return;
}
else if(nChar > 0x2f && nChar < 0x3a)
{
// 删除选择部分
if(nClose > nStart)
{
// 小数点后面部分
if(nStart > nPoint) nTemp = nStart;
else nTemp = nPoint + 1;
if(nClose > nTemp)
XCleanStr(m_lpText, nTemp, nClose);
// 小数点前面部分
if(nClose < nPoint) nTemp = nClose;
else nTemp = nPoint;
if(nStart < nTemp)
{
XDeleteStr(m_lpText, nStart, nTemp);
nPoint -= (nTemp - nStart);
}
nClose = nStart;
}
// 输入单个数字
if( m_lpText[nStart] != '-' &&
m_lpText[nStart] != 0x00 )
{
if(nStart > nPoint)
m_lpText[nStart] = nChar;
else
XInsertChar(m_lpText, nStart, nChar);
nStart ++; nClose = nStart;
}
// 设置当前文本
SetWindowText(m_lpText);
SetSel(nStart, nStart);
}
else // ------ 不可输入字符
{
// 非法输入字符
return;
}
// 如果分段显示
if( m_bSection )
{
TCHAR lpTemp[128];
BOOL bBefore = FALSE;
long nByte = 0, nIdx = 127;
long nCount = lstrlen(m_lpText);
lpTemp[127] = 0x00;
if(nStart == nCount)
nClose = nIdx;
// 重新生成Section
while(nCount > 0)
{
nCount --;
if(m_lpText[nCount] != ',')
{
nIdx --; nByte ++;
lpTemp[nIdx] = m_lpText[nCount];
// 遇到逗号
if(m_lpText[nCount] == '.')
{
nByte = 0;
bBefore = TRUE;
}
// 留出逗号来
if(bBefore && nByte == 3)
{
nIdx --; nByte = 0;
lpTemp[nIdx] = ',';
}
}
// 记载nStart的位置
if(nCount == nStart)
{
nClose = nIdx;
if(lpTemp[nIdx] == ',')
nClose ++;
}
}
if(lpTemp[nIdx] == ',')
nIdx ++;
// 检查前面的逗号
if( lpTemp[nIdx] == '-' &&
lpTemp[nIdx + 1] == ',' )
{
nIdx ++;
lpTemp[nIdx] = '-';
}
// 设置当前文本
lstrcpy(m_lpText, lpTemp + nIdx);
SetWindowText(m_lpText);
nStart = nClose - nIdx;
SetSel(nStart, nStart);
}
}
void CNumberEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// 如果只读的话
if(GetStyle() & ES_READONLY)
return;
switch( m_nNumType )
{
case 0: // 整数
OnCharInteger(nChar);
break;
case 1: // 浮点小数
OnCharDecimal(nChar);
break;
case 2: // 定点小数
OnCharRadixPoint(nChar);
break;
}
}
void CNumberEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// 如果只读的话
if(GetStyle() & ES_READONLY)
return;
if(nChar == VK_DELETE)
{
OnChar(0x0e, 0x01, 0x01);
return;
}
// Default KeyDown function
CFlatEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CNumberEdit::OnRButtonDown(UINT, CPoint)
{
/* 防止右键快捷方式 */
}
// 设置整数
void CNumberEdit::SetNumber(long nNumber)
{
char lpBuffer[32];
if( m_bNegative )
sprintf(lpBuffer, "%ld", nNumber);
else
sprintf(lpBuffer, "%lu", nNumber);
// 如果分段的话
if( m_bSection )
{
long nIdx = 0, nPos = 0;
long nLength = strlen(lpBuffer);
if(lpBuffer[0] == '-')
{
m_lpText[nIdx ++] = lpBuffer[0];
nPos ++; nLength --;
}
// 转移缓冲区
while(nLength > 0)
{
// 无论如何,加入一个数字
m_lpText[nIdx] = lpBuffer[nPos];
nIdx ++; nPos ++; nLength --;
// 加入一个逗号
if(nLength % 3 == 0)
m_lpText[nIdx ++] = ',';
}
// 使m_lpText以NULL结束
m_lpText[nIdx - 1] = 0x00;
}
else
{
// 直接拷贝到缓冲区
strcpy(m_lpText, lpBuffer);
}
// 设置窗口文字
SetWindowText(m_lpText);
}
// 设置浮点数
void CNumberEdit::SetNumber(double dbNumber)
{
char lpBuffer[64];
if(m_nNumType == 0)
{
// 当前是整数
long nValue = (long)dbNumber;
sprintf(lpBuffer, "%ld", nValue);
}
else if(m_nNumType == 1)
{
// 当前是浮点小数
sprintf(lpBuffer, "%f", dbNumber);
// 去掉后面无效的零
long nIdx = strlen(lpBuffer);
while(nIdx > 0)
{
nIdx --;
if(lpBuffer[nIdx] == '0')
lpBuffer[nIdx] = 0x00;
else
{
// 去掉小数点
if(lpBuffer[nIdx] == '.')
lpBuffer[nIdx] = 0x00;
break;
}
}
}
else
{
// 当前是定点小数
char lpFormat[8];
sprintf(lpFormat, "%%1.%ldf", m_nDecimal);
sprintf(lpBuffer, lpFormat, dbNumber);
}
// 如果要分段的话
if( m_bSection )
{
// 前面整数的位数
long nLength = 0;
while(lpBuffer[nLength] != 0x00)
{
if(lpBuffer[nLength] != '.')
nLength ++;
else break;
}
// 给前面的整数加逗号
long nSize = nLength;
long nIdx = 0, nPos = 0;
if(lpBuffer[0] == '-')
{
m_lpText[nIdx ++] = lpBuffer[0];
nPos ++; nLength --;
}
while(nLength > 0)
{
// 无论如何,加入一个数字
m_lpText[nIdx] = lpBuffer[nPos];
nIdx ++; nPos ++; nLength --;
// 加入一个逗号
if(nLength % 3 == 0)
m_lpText[nIdx ++] = ',';
}
// 将后面小数部分加上
nIdx --;
while(lpBuffer[nSize] != 0x00)
{
m_lpText[nIdx] = lpBuffer[nSize];
nIdx ++; nSize ++;
}
// 后面添加NULL
m_lpText[nIdx] = 0x00;
}
else
{
// 直接拷贝到缓冲区
strcpy(m_lpText, lpBuffer);
}
// 设置窗口文字
SetWindowText(m_lpText);
}
// 获取整数
void CNumberEdit::GetNumber(long * lpNumber)
{
char lpBuffer[64];
long nIdx = 0, nLength = strlen(m_lpText);
// 去掉所有的逗号
for(long i = 0; i < nLength; i ++)
{
if(m_lpText[i] != ',')
lpBuffer[nIdx ++] = m_lpText[i];
}
// 调整数据缓冲区
lpBuffer[nIdx] = 0x00;
lpNumber[0] = atol(lpBuffer);
}
// 获取浮点数
void CNumberEdit::GetNumber(double * lpNumber)
{
char lpBuffer[64];
long nIdx = 0, nLength = strlen(m_lpText);
// 去掉所有的逗号
for(long i = 0; i < nLength; i ++)
{
if(m_lpText[i] != ',')
lpBuffer[nIdx ++] = m_lpText[i];
}
// 读取数据
lpBuffer[nIdx] = 0x00;
lpNumber[0] = atof(lpBuffer);
}
/////////////////////////////////////////////
// 跟MFC兼容的几个数据交换函数 //
/////////////////////////////////////////////
AFX_EXT_API void AFXAPI DDX_Number(CDataExchange * lpDX, int nIDC,
CNumberEdit & wndEdit, short & nShort)
{
// 如果没有获取窗口
if(wndEdit.m_hWnd == NULL)
{
// 获取窗口句柄
HWND hWndCtrl = lpDX->PrepareCtrl(nIDC);
if( !wndEdit.SubclassWindow(hWndCtrl) )
{
ASSERT(FALSE);
AfxThrowNotSupportedException();
}
}
// 开始交换数据
if( lpDX->m_bSaveAndValidate )
{
long nTemp = 0;
wndEdit.GetNumber(&nTemp);
nShort = (short)nTemp;
}
else
{
long nTemp = nShort;
wndEdit.SetNumber(nTemp);
}
}
AFX_EXT_API void AFXAPI DDX_Number(CDataExchange * lpDX, int nIDC,
CNumberEdit & wndEdit, long & nValue)
{
// 如果没有获取窗口
if(wndEdit.m_hWnd == NULL)
{
// 获取窗口句柄
HWND hWndCtrl = lpDX->PrepareCtrl(nIDC);
if( !wndEdit.SubclassWindow(hWndCtrl) )
{
ASSERT(FALSE);
AfxThrowNotSupportedException();
}
}
// 开始交换数据
if( lpDX->m_bSaveAndValidate )
{
long nTemp = 0;
wndEdit.GetNumber(&nTemp);
nValue = nTemp;
}
else
{
long nTemp = nValue;
wndEdit.SetNumber(nTemp);
}
}
AFX_EXT_API void AFXAPI DDX_Number(CDataExchange * lpDX, int nIDC,
CNumberEdit & wndEdit, float & dbFloat)
{
// 如果没有获取窗口
if(wndEdit.m_hWnd == NULL)
{
// 获取窗口句柄
HWND hWndCtrl = lpDX->PrepareCtrl(nIDC);
if( !wndEdit.SubclassWindow(hWndCtrl) )
{
ASSERT(FALSE);
AfxThrowNotSupportedException();
}
}
// 开始交换数据
if( lpDX->m_bSaveAndValidate )
{
double dbTemp = 0.0;
wndEdit.GetNumber(&dbTemp);
dbFloat = (float)dbTemp;
}
else
{
double dbTemp = dbFloat;
wndEdit.SetNumber(dbTemp);
}
}
AFX_EXT_API void AFXAPI DDX_Number(CDataExchange * lpDX, int nIDC,
CNumberEdit & wndEdit, double & dbDouble)
{
// 如果没有获取窗口
if(wndEdit.m_hWnd == NULL)
{
// 获取窗口句柄
HWND hWndCtrl = lpDX->PrepareCtrl(nIDC);
if( !wndEdit.SubclassWindow(hWndCtrl) )
{
ASSERT(FALSE);
AfxThrowNotSupportedException();
}
}
// 开始交换数据
if( lpDX->m_bSaveAndValidate )
{
double dbTemp = 0.0;
wndEdit.GetNumber(&dbTemp);
dbDouble = dbTemp;
}
else
{
double dbTemp = dbDouble;
wndEdit.SetNumber(dbTemp);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -