You are here

Erstellen eines Nachrichten-Handlers für WM_CHAR

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
}