|
|
1.1 root 1: // This is a part of the Microsoft Foundation Classes C++ library.
2: // Copyright (C) 1992 Microsoft Corporation
3: // All rights reserved.
4: //
5: // This source code is only intended as a supplement to the
6: // Microsoft Foundation Classes Reference and Microsoft
7: // QuickHelp documentation provided with the library.
8: // See these sources for detailed information regarding the
9: // Microsoft Foundation Classes product.
10:
11:
12: #include "afxwin.h"
13: #pragma hdrstop
14:
15: #ifdef AFX_CORE_SEG
16: #pragma code_seg(AFX_CORE_SEG)
17: #endif
18:
19: #ifdef _DEBUG
20: #undef THIS_FILE
21: static char BASED_CODE THIS_FILE[] = __FILE__;
22: #define new DEBUG_NEW
23: #endif
24:
25:
26: // NOTE: the IMPLEMENT_DYNAMIC lines for CListBox, CComboBox, CButton
27: // are in WINDOW.CPP, since they are only used by Self Draw controls we reduce
28: // granularity by putting them there.
29:
30:
31: /////////////////////////////////////////////////////////////////////////////
32: // CStatic
33:
34: IMPLEMENT_DYNAMIC(CStatic, CWnd)
35:
36: WNDPROC* CStatic::GetSuperWndProcAddr()
37: {
38: static WNDPROC pfnSuper;
39: return &pfnSuper;
40: }
41:
42: BOOL CStatic::Create(LPCSTR lpText, DWORD dwStyle,
43: const RECT& rect, CWnd* pParentWnd, UINT nID)
44: {
45: return CWnd::Create("STATIC", lpText, dwStyle, rect, pParentWnd, nID);
46: }
47:
48: /////////////////////////////////////////////////////////////////////////////
49: // CButton
50:
51:
52: WNDPROC* CButton::GetSuperWndProcAddr()
53: {
54: static WNDPROC pfnSuper;
55: return &pfnSuper;
56: }
57:
58: BOOL CButton::Create(LPCSTR lpCaption, DWORD dwStyle,
59: const RECT& rect, CWnd* pParentWnd, UINT nID)
60: {
61: return CWnd::Create("BUTTON", lpCaption, dwStyle, rect, pParentWnd, nID);
62: }
63:
64: // Helper for radio buttons
65: int CWnd::GetCheckedRadioButton(int nIDFirstButton, int nIDLastButton)
66: {
67: for (int nID = nIDFirstButton; nID <= nIDLastButton; nID++)
68: {
69: if (IsDlgButtonChecked(nID))
70: return nID; // id that matched
71: }
72: return 0; // invalid ID
73: }
74:
75: // Derived class is responsible for implementing all of these handlers
76: // for owner/self draw controls
77: void CButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
78: { ASSERT(FALSE); }
79:
80: /////////////////////////////////////////////////////////////////////////////
81: // CListBox
82:
83:
84: WNDPROC* CListBox::GetSuperWndProcAddr()
85: {
86: static WNDPROC pfnSuper;
87: return &pfnSuper;
88: }
89:
90: BOOL CListBox::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
91: UINT nID)
92: {
93: return CWnd::Create("LISTBOX", NULL, dwStyle, rect, pParentWnd, nID);
94: }
95:
96: // Derived class is responsible for implementing these handlers
97: // for owner/self draw controls (except for the optional DeleteItem)
98: void CListBox::DrawItem(LPDRAWITEMSTRUCT)
99: { ASSERT(FALSE); }
100: void CListBox::MeasureItem(LPMEASUREITEMSTRUCT)
101: { ASSERT(FALSE); }
102: int CListBox::CompareItem(LPCOMPAREITEMSTRUCT)
103: { ASSERT(FALSE); return 0; }
104: void CListBox::DeleteItem(LPDELETEITEMSTRUCT)
105: { /* default to nothing */ }
106:
107: /////////////////////////////////////////////////////////////////////////////
108: // CComboBox
109:
110:
111: WNDPROC* CComboBox::GetSuperWndProcAddr()
112: {
113: static WNDPROC pfnSuper;
114: return &pfnSuper;
115: }
116:
117: BOOL CComboBox::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
118: UINT nID)
119: {
120: return CWnd::Create("COMBOBOX", NULL, dwStyle, rect, pParentWnd, nID);
121: }
122:
123: // Derived class is responsible for implementing these handlers
124: // for owner/self draw controls (except for the optional DeleteItem)
125: void CComboBox::DrawItem(LPDRAWITEMSTRUCT)
126: { ASSERT(FALSE); }
127: void CComboBox::MeasureItem(LPMEASUREITEMSTRUCT)
128: { ASSERT(FALSE); }
129: int CComboBox::CompareItem(LPCOMPAREITEMSTRUCT)
130: { ASSERT(FALSE); return 0; }
131: void CComboBox::DeleteItem(LPDELETEITEMSTRUCT)
132: { /* default to nothing */ }
133:
134: /////////////////////////////////////////////////////////////////////////////
135: // CEdit
136:
137: IMPLEMENT_DYNAMIC(CEdit, CWnd)
138:
139: WNDPROC* CEdit::GetSuperWndProcAddr()
140: {
141: static WNDPROC pfnSuper;
142: return &pfnSuper;
143: }
144:
145: BOOL CEdit::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
146: {
147: return CWnd::Create("EDIT", NULL, dwStyle, rect, pParentWnd, nID);
148: }
149:
150: /////////////////////////////////////////////////////////////////////////////
151: // CScrollBar
152:
153: IMPLEMENT_DYNAMIC(CScrollBar, CWnd)
154:
155: WNDPROC* CScrollBar::GetSuperWndProcAddr()
156: {
157: static WNDPROC pfnSuper;
158: return &pfnSuper;
159: }
160:
161: BOOL CScrollBar::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
162: UINT nID)
163: {
164: return CWnd::Create("SCROLLBAR", NULL, dwStyle, rect, pParentWnd, nID);
165: }
166:
167: /////////////////////////////////////////////////////////////////////////////
168: // Extra CWnd support for dynamic subclassing of controls
169:
170: BOOL CWnd::SubclassWindow(HWND hWnd)
171: {
172: if (!Attach(hWnd))
173: return NULL;
174:
175: // now hook into the AFX WndProc
176: WNDPROC* lplpfn = GetSuperWndProcAddr();
177: WNDPROC oldWndProc = (WNDPROC)::SetWindowLong(hWnd, GWL_WNDPROC,
178: (DWORD)(WNDPROC)AfxWndProc);
179: ASSERT(oldWndProc != (WNDPROC)AfxWndProc);
180:
181: if (*lplpfn == NULL)
182: *lplpfn = oldWndProc; // the first edit control created
183: return TRUE;
184: }
185:
186: BOOL CWnd::SubclassDlgItem(UINT nID, CWnd* pParent)
187: {
188: HWND hWndControl = ::GetDlgItem(pParent->m_hWnd, nID);
189: if (hWndControl == NULL)
190: return FALSE;
191: return SubclassWindow(hWndControl);
192: }
193:
194: /////////////////////////////////////////////////////////////////////////////
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.