Annotation of mstools/mfc/samples/ctrltest/paredit2.cpp, revision 1.1.1.1

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: /////////////////////////////////////////////////////////////////////////////

unix.superglobalmegacorp.com

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