⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 numberedit.cpp

📁 对c++中的各种ui对象进行封装
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		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 + -