|
|
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: /////////////////////////////////////////////////////////////////////////////
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.