Numberedit.h
#ifndef __numberedit_h__
#define __numberedit_h__
Class CNumberedit: Public Cedit
{
PUBLIC:
CNUMBEREDIT ();
Virtual ~ cnumberedit ();
Void setAfterdotlen (uint iafterdotlen) {m_iafterdotlen = iafterdotlen;
Uint getAfterDotlen () {return m_iafterdotlen;
protected:
Bool CHECKNUMBER (uint nchar, uint nrepcnt, uint nflags);
// Bool CHECKONEPLUS (uint nchar, uint nrepcnt, uint nflags);
Bool CheckOnEminus (uint nchar, uint nrepcnt, uint nflags);
Bool Checkonedot (uint nchar, uint nrepcnt, uint nflags);
Int getcaretxpos ();
CSTRING M_STR;
Uint m_iafterdotlen;
protected:
// {{AFX_MSG (CUNTCNUMBEREDIT)
AFX_MSG Void Onchar (uint nchar, uint nrepcnt, uint nflags);
AFX_MSG void onkillfocus ();
//}} AFX_MSG
Declare_message_map ()
}
#ENDIF
Numberedit.cpp
#include "stdafx.h"
#include "numberedit.h"
Cnumberedit :: cnumbedit ()
{
m_iafterdotlen = 2;
m_str = _t ("0.00");
}
Cnumberedit :: ~ cnumberedit ()
{
}
Begin_Message_Map (CNUMBEREDIT, CEDIT)
// {{AFX_MSG_MAP (cnumberedit)
ON_WM_CHAR ()
ON_CONTROL_REFLECT (En_killfocus, ONKILLFOCUS)
//}} AFX_MSG_MAP
END_MESSAGE_MAP ()
Void cnumberedit :: onchar (uint nchar, uint nrepcnt, uint nflags)
{
// Todo: add your message handler code here and / or call default
IF (nchar == 8)
{
CEDIT :: OnChar (nchar, nrepcnt, nflags);
Return;
}
Bool bchange = false;
GetWindowText (M_STR);
IF (Checknumber (nchar, nrepcnt, nflags)
{
Bchange = true;
}
// Else IF (CheckonePlus (nchar, nrepcnt, nflags))
// {
//; // do nothing
//}
Else IF (CheckOnEminus (nchar, nrepcnt, nflags)
{
Bchange = true;
}
Else IF (Checkonedot (nchar, nrepcnt, nflags)
{
Bchange = true;
}
IF (bchange)
{
CEDIT :: OnChar (nchar, nrepcnt, nflags);
//Setformattext();/m_point.x = m_point.y * 6;
// setCareTPOS (m_point);
}
}
Void Cuntcnumberedit :: ONKILLFOCUS () {getWindowText (m_str);
INT iLOP = m_iafterdotlen; if (m_str.isempty ()) {m_str = "0."} else if (m_str.getlength () == 1 && m_str [0] == TCHAR ('-')) {m_str = "0."} else {int idotpos = m_str.find (tchar ('.')); If (idotpos == 0) m_str = "0" m_STR; ELSE IF (iDotpos <0) m_str = "." ;
Idotpos = m_Str.Find (TCHAR ('.')); INT Ilen = m_Str.getLength () - 1 - Idotpos; iLoop = (int) m_iafterdotlen - ilen;} if (iLOOP> = 0) {for (int i = 0; I SetWindowText (m_str); Bool cnumberedit :: Checknumber (uint nchar, uint nrepcnt, uint nflags) { IF (:: isdigit (nchar) == 0) Return False; Int idotpos = m_str.find (tchar ('.')); IF (idotpos> = 0) { INT Ilen = m_str.getlength () - 1 - iDOTPOS; IF ((getCaretXPOS ()> = idotpos) && (ilen> = (int) m_iafterdotlen)) { Return False; } } Return True; } Bool CNumberedit :: CheckOnEminus (uint nchar, uint nrepcnt, uint nflags) { IF (nchar! = '-') Return False; IF (getcaretxpos ()! = 0) Return False; IF (! m_str.isempty () && m_str.getat (0) == TCHAR ('-'))))) Return False; Return True; } Bool cnumberedit :: CheckONEDOT (uint nchar, uint nrepcnt, uint nflags) { IF (nchar! = '.') Return False; IF (m_str.find (tchar ('.'))> = 0) Return False; INT ipos = getcaretxpos (); IF (ipos == 0) Return False; Else IF (ipos == 1 && m_str [0] == TCHAR ('-')) Return False; Return True; } INT CNUMBEREDIT :: getcaretxpos () { Cpoint P = getCaretPos (); Return (p.x - p.y) / 6; }