|
|
1.1 ! root 1: // paredit2.cpp : code needed to export CParsedEdit as a WndClass ! 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: // The C++ class CParsedEdit can be made visible to the dialog manager ! 19: // by registering a window class for it ! 20: // The C++ class 'CParsedEditExported' is used to implement the ! 21: // creation and destruction of a C++ object as if it were just ! 22: // a normal Windows control. ! 23: // In order to hook in the class creation we must provide a special ! 24: // WndProc to create the C++ object and override the PostNcDestroy ! 25: // message to destroy it ! 26: ! 27: class CParsedEditExported : public CParsedEdit // WNDCLASS exported class ! 28: { ! 29: public: ! 30: CParsedEditExported(HWND hWnd) ! 31: { VERIFY(Attach(hWnd)); } ! 32: ! 33: // Implementation: (all is implementation since the public interface of ! 34: // this class is identical to CParsedEdit) ! 35: protected: ! 36: virtual WNDPROC* GetSuperWndProcAddr(); ! 37: static WNDPROC lpfnSuperWndProc; ! 38: afx_msg int OnNcCreate(LPCREATESTRUCT lpCreateStruct); ! 39: virtual void PostNcDestroy(); ! 40: static LONG FAR PASCAL __export WndProcHook(HWND, UINT, UINT, LONG); ! 41: DECLARE_MESSAGE_MAP(); ! 42: ! 43: friend class CParsedEdit; // for RegisterControlClass ! 44: }; ! 45: ! 46: ///////////////////////////////////////////////////////////////////////////// ! 47: // Special create hooks ! 48: ! 49: LONG FAR PASCAL __export ! 50: CParsedEditExported::WndProcHook(HWND hWnd, UINT msg, UINT wParam, LONG lParam) ! 51: { ! 52: // create new item and attach it ! 53: CParsedEditExported* pEdit = new CParsedEditExported(hWnd); ! 54: ! 55: // set up wndproc to AFX one, and call it ! 56: ::SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)AfxWndProc); ! 57: #ifdef STRICT ! 58: return ::CallWindowProc(AfxWndProc, hWnd, msg, wParam, lParam); ! 59: #else ! 60: return ::CallWindowProc((FARPROC)AfxWndProc, hWnd, msg, wParam, lParam); ! 61: #endif ! 62: } ! 63: ! 64: ! 65: BEGIN_MESSAGE_MAP(CParsedEditExported, CParsedEdit) ! 66: ON_WM_NCCREATE() ! 67: END_MESSAGE_MAP() ! 68: ! 69: int CParsedEditExported::OnNcCreate(LPCREATESTRUCT lpCreateStruct) ! 70: { ! 71: // special create hook ! 72: // example of stripping the sub-style bits from the style specified ! 73: // in the dialog template to use for some other reason ! 74: m_wParseStyle = LOWORD(lpCreateStruct->style); ! 75: DWORD dwEditStyle = MAKELONG(ES_LEFT, HIWORD(lpCreateStruct->style)); ! 76: ! 77: ::SetWindowLong(m_hWnd, GWL_STYLE, dwEditStyle); ! 78: lpCreateStruct->style = dwEditStyle; ! 79: return CParsedEdit::OnNcCreate(lpCreateStruct); ! 80: } ! 81: ! 82: void CParsedEditExported::PostNcDestroy() ! 83: { ! 84: // needed to clean up ! 85: delete this; ! 86: } ! 87: ! 88: WNDPROC CParsedEditExported::lpfnSuperWndProc = NULL; ! 89: WNDPROC* CParsedEditExported::GetSuperWndProcAddr() ! 90: { ! 91: return &lpfnSuperWndProc; ! 92: } ! 93: ! 94: ///////////////////////////////////////////////////////////////////////////// ! 95: // Routine to register the class ! 96: BOOL CParsedEdit::RegisterControlClass() ! 97: { ! 98: WNDCLASS wcls; ! 99: ! 100: // Always set the super class address ! 101: // since the second instance will not need to register the WndClass, ! 102: // but will still need to set the super-proc address ! 103: if (!::GetClassInfo(NULL, "edit", &wcls)) ! 104: { ! 105: return FALSE; ! 106: } ! 107: ! 108: // set appropriate super class address ! 109: CParsedEditExported::lpfnSuperWndProc = wcls.lpfnWndProc; // "EDIT" wnd proc ! 110: ! 111: // check to see if class already registered ! 112: static const char szClass[] = "paredit"; ! 113: if (::GetClassInfo(AfxGetInstanceHandle(), szClass, &wcls)) ! 114: { ! 115: // name already registered - ok if it was us ! 116: return (wcls.lpfnWndProc == CParsedEditExported::WndProcHook); ! 117: } ! 118: ! 119: // set new values ! 120: wcls.lpfnWndProc = CParsedEditExported::WndProcHook; ! 121: wcls.hInstance = AfxGetInstanceHandle(); ! 122: wcls.lpszClassName = szClass; ! 123: return (RegisterClass(&wcls) != 0); ! 124: } ! 125: ! 126: ! 127: /////////////////////////////////////////////////////////////////////////////
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.