|
|
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: { ! 125: if (GetParent()->SendMessage(WM_COMMAND, ! 126: GetDlgCtrlID(), MAKELONG(m_hWnd, PEN_ILLEGALCHAR)) != -1) ! 127: { ! 128: MessageBeep(-1); ! 129: } ! 130: } ! 131: ! 132: /////////////////////////////////////////////////////////////////////////////
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.