Die Funktion OnChar überwacht die Eingabe. In Abhängigkeit von dem eingegebenen Zeichen reagiert sie unterschiedlich:
- Ist die Eingabe eine Zahl, ein Minus oer ein Steuerungszeichen, ruft CHertzEdit die Basisklasse CEdit auf. Dadurch wird die normale Funktionalität für diese Zeichen garantiert.
- Ist die Eingabe ein Punkt, wird geprüft ob sich schon ein Punkt in dem Eingabe-Fenster befindet. Wenn ja, wird die Eingabe ignoriert, wenn nein, wird die Eingabe angenommen (Aufruf von CEdit::OnChar).
- Ist die Eingabe ein Buchstabe, der eine Einheit repräsentiert, wird die aktuelle Einheit abgeschnitten und die neue angehängt.
- Alle anderen Eingaben werden ignoriert (also kein Aufruf der Basisklasse)
void CHertzEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags){        if (iscntrl(nChar))        {                CEdit::OnChar(nChar, nRepCnt, nFlags);                return;        }
        CString str_nChar(nChar);        CString strZiel;        if (m_bNegativAllowed)                strZiel=str_nChar.SpanIncluding("0123456789kKmMhHzZ.-");        else                strZiel=str_nChar.SpanIncluding("0123456789kKmMhHzZ.");
        // Ist nChar aus dem erlaubten Zeichensatz(s.o.) ?        if (strZiel.IsEmpty())                return;
        // Ist nChar eine Zahl ?        strZiel=str_nChar.SpanIncluding(".kKmMhHzZ");        if (strZiel.IsEmpty()) {                // Zahl ?, ja dann // Basisklasse                CEdit::OnChar(nChar, nRepCnt, nFlags);                return;        }
        // Hole den Inhalt des Edit-Controls        int nTextLen=GetWindowTextLength();        char* pChar=new char[nTextLen+1]; // incl. abschliessender \0        GetWindowText(pChar, nTextLen+1);        CString strText(pChar);
        delete[] pChar;
        if (nChar=='.') {                // ist schon ein Punkt da                if (strText.Find('.')== -1) {                         // nein -> Basisklasse                         CEdit::OnChar(nChar, nRepCnt, nFlags);                        return;                } else {                        // ja -> Abgang                        return;                }        }
        BOOL wasK, wasM, wasHz;
        // Einheit sukzessive abschneiden und testen        if (strText.Remove('m') || strText.Remove('M')) wasM=TRUE;            else wasM=FALSE;        if (strText.Remove('k') || strText.Remove('K')) wasK=TRUE;            else wasK=FALSE;        if (strText.Remove('h') || strText.Remove('H')) wasHz=TRUE;            else wasHz=FALSE;        if ((strText.Remove('z') || strText.Remove('Z')) && wasHz)                wasHz=TRUE;        else                wasHz=FALSE;
        strText.Remove(' ');
        if (nChar=='k' || nChar=='K') {                strText+=" KHz";                SetWindowText(strText);                SetModify();                return;        }        if (nChar=='m' || nChar=='M') {                strText+=" MHz";                SetWindowText(strText);                SetModify();                return;        }        if (nChar=='h' || nChar=='H' || nChar=='z' || nChar=='Z') {                if (wasK) {                        strText+=" KHz";                        SetWindowText(strText);                        SetModify();                        return;                }                if (wasM) {                        strText+=" MHz";                        SetWindowText(strText);                        SetModify();                        return;                }                strText+=" Hz";                SetWindowText(strText);                SetModify();                return;        }        ASSERT(FALSE); // sollte nie erreicht werden}