Annotation of mstools/mfc/samples/ctrltest/paredit.cpp, revision 1.1.1.2

1.1       root        1: // paredit.cpp: C++ derived edit control for numbers/letters etc
                      2: //
                      3: // This is a part of the Microsoft Foundation Classes C++ library.
                      4: // Copyright (C) 1992 Microsoft Corporation
                      5: // All rights reserved.
                      6: //
                      7: // This source code is only intended as a supplement to the
                      8: // Microsoft Foundation Classes Reference and Microsoft
                      9: // QuickHelp documentation provided with the library.
                     10: // See these sources for detailed information regarding the
                     11: // Microsoft Foundation Classes product.
                     12: 
                     13: #include "ctrltest.h"
                     14: 
                     15: #include "paredit.h"
                     16: 
                     17: /////////////////////////////////////////////////////////////////////////////
                     18: // ParsedEdit
                     19: 
                     20: CParsedEdit::CParsedEdit()
                     21: {
                     22:        m_wParseStyle = 0;
                     23: }
                     24: 
                     25: BEGIN_MESSAGE_MAP(CParsedEdit, CEdit)
                     26:        ON_WM_CHAR()
                     27:        ON_WM_VSCROLL()     // for associated spin controls
                     28: END_MESSAGE_MAP()
                     29: 
                     30: /////////////////////////////////////////////////////////////////////////////
                     31: // Creating from C++ code
                     32: 
                     33: BOOL CParsedEdit::Create(DWORD dwStyle, const RECT& rect,
                     34:                CWnd* pParentWnd, UINT nID)
                     35: {
                     36:        m_wParseStyle = LOWORD(dwStyle);
                     37:        // figure out edit control style
                     38:        DWORD dwEditStyle = MAKELONG(ES_LEFT, HIWORD(dwStyle));
                     39:        return CWnd::Create("EDIT", NULL, dwEditStyle, rect, pParentWnd, nID);
                     40: }
                     41: 
                     42: /////////////////////////////////////////////////////////////////////////////
                     43: // Aliasing on top of an existing Edit control
                     44: 
                     45: BOOL CParsedEdit::SubclassEdit(UINT nID, CWnd* pParent, WORD wParseStyle)
                     46: {
                     47:        m_wParseStyle = wParseStyle;
                     48:        HWND hWndEdit = ::GetDlgItem(pParent->m_hWnd, nID);
                     49:        if (hWndEdit == NULL)
                     50:                return FALSE;
                     51:        return SubclassWindow(hWndEdit);
                     52: }
                     53: 
                     54: /////////////////////////////////////////////////////////////////////////////
                     55: // Input character filter
                     56: 
                     57: void CParsedEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
                     58: {
                     59:        WORD type;
                     60: 
                     61:        if (nChar < 0x20)
                     62:                type = PES_ALL;                         // always allow control chars
                     63:        else if (nChar >= '0' && nChar <= '9')
                     64:                type = PES_NUMBERS;
                     65:        else if (nChar >= 'A' && nChar <= 'Z')      // hard coded to english
                     66:                type = PES_LETTERS;
                     67:        else if (nChar >= 'a' && nChar <= 'z')
                     68:                type = PES_LETTERS;
                     69:        else
                     70:                type = PES_OTHERCHARS;
                     71: 
                     72:        if (m_wParseStyle & type)
                     73:        {
                     74:                CEdit::OnChar(nChar, nRepCnt, nFlags);  // permitted
                     75:        }
                     76:        else
                     77:        {
                     78:                // illegal character - inform parent
                     79:                OnBadInput();
                     80:        }
                     81: }
                     82: 
                     83: /////////////////////////////////////////////////////////////////////////////
                     84: // Spin controls will send scroll messages
                     85: 
                     86: void CParsedEdit::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
                     87: {
                     88:        int nDelta = 0;
                     89:        if (nSBCode == SB_LINEDOWN)
                     90:                nDelta = -1;
                     91:        else if (nSBCode == SB_LINEUP)
                     92:                nDelta = +1;
                     93:        else
                     94:                return; // nothing special
                     95: 
                     96:        // set the focus to this edit item and select it all
                     97:        SetFocus();
                     98: 
                     99:        //Get the number in the control.
                    100:        BOOL bOk;
                    101:        int nOld = GetParent()->GetDlgItemInt(GetDlgCtrlID(), &bOk);
                    102:        if (bOk)
                    103:        {
                    104:                // The MuScroll control also supports range checking
                    105:                // for this example, we just prevent overflow
                    106:                int nNew = nOld + nDelta;
                    107:                if (nNew >= 0 && nNew <= 32767)
                    108:                        GetParent()->SetDlgItemInt(GetDlgCtrlID(), nNew);
                    109:                else
                    110:                        bOk = FALSE;
                    111:        }
                    112: 
                    113:        if (!bOk)
                    114:                OnBadInput();
                    115:        SetSel(0, -1);
                    116: }
                    117: 
                    118: /////////////////////////////////////////////////////////////////////////////
                    119: // default bad input handler, beep (unless parent notification
                    120: //    returns -1.  Most parent dialogs will return 0 or 1 for command
                    121: //    handlers (i.e. Beep is the default)
                    122: 
                    123: void CParsedEdit::OnBadInput()
                    124: {
1.1.1.2 ! root      125:        // In the Win32 API, the WM_COMMAND message is packed differently.
        !           126:        // When using the Microsoft Foundation Classes this is hardly noticed,
        !           127:        // because of the ON_COMMAND macro and message maps.  If you need
        !           128:        // to send a WM_COMMAND to a window, the packing is specific to the
        !           129:        // target: Win32 or Win16...
        !           130: 
        !           131: #ifndef _NTWIN
        !           132:        if (GetParent()->SendMessage(WM_COMMAND,
        !           133:                GetDlgCtrlID(), MAKELONG(m_hWnd, PEN_ILLEGALCHAR)) != -1)
        !           134: #else
1.1       root      135:        if (GetParent()->SendMessage(WM_COMMAND,
1.1.1.2 ! root      136:                MAKELONG(GetDlgCtrlID(), PEN_ILLEGALCHAR), (LPARAM)m_hWnd) != -1)
        !           137: #endif
1.1       root      138:        {
                    139:                MessageBeep(-1);
                    140:        }
                    141: }
                    142: 
                    143: /////////////////////////////////////////////////////////////////////////////

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.