Annotation of mstools/mfc/samples/ctrltest/paredit2.cpp, revision 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.