home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / mfc / general / ctrltest / paredit2.cpp < prev    next >
C/C++ Source or Header  |  1998-03-26  |  4KB  |  133 lines

  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-1998 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 related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12.  
  13. #include "stdafx.h"
  14. #include "ctrltest.h"
  15.  
  16. #include "paredit.h"
  17. #include <ctl3d.h>
  18.  
  19. /////////////////////////////////////////////////////////////////////////////
  20. // The C++ class CParsedEdit can be made visible to the dialog manager
  21. //   by registering a window class for it
  22. // The C++ class 'CParsedEditExported' is used to implement the
  23. //   creation and destruction of a C++ object as if it were just
  24. //   a normal Windows control.
  25. // In order to hook in the class creation we must provide a special
  26. //   WndProc to create the C++ object and override the PostNcDestroy
  27. //   message to destroy it
  28.  
  29. class CParsedEditExported : public CParsedEdit      // WNDCLASS exported class
  30. {
  31. public:
  32.     CParsedEditExported() { };
  33.     BOOL RegisterControlClass();
  34.  
  35. // Implementation: (all is implementation since the public interface of
  36. //    this class is identical to CParsedEdit)
  37. protected:
  38.     virtual void PostNcDestroy();
  39.     static LRESULT CALLBACK EXPORT WndProcHook(HWND, UINT, WPARAM, LPARAM);
  40.     static WNDPROC lpfnSuperEdit;
  41.  
  42.     friend class CParsedEdit;       // for RegisterControlClass
  43.  
  44.     //{{AFX_MSG(CParsedEditExported)
  45.     afx_msg int OnNcCreate(LPCREATESTRUCT lpCreateStruct);
  46.     //}}AFX_MSG
  47.     DECLARE_MESSAGE_MAP();
  48. };
  49.  
  50. /////////////////////////////////////////////////////////////////////////////
  51. // Special create hooks
  52.  
  53. LRESULT CALLBACK EXPORT
  54. CParsedEditExported::WndProcHook(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  55. {
  56.     // create new item and attach it
  57.     CParsedEditExported* pEdit = new CParsedEditExported();
  58.     pEdit->Attach(hWnd);
  59.  
  60.     // set up wndproc to AFX one, and call it
  61.     pEdit->m_pfnSuper = CParsedEditExported::lpfnSuperEdit;
  62.     ::SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)AfxWndProc);
  63.  
  64.     // Since this window is really an edit control but does not
  65.     //  have "edit" as its class name, to make it work correctly
  66.     //  with CTL3D, we have to tell CTL3D that is "really is" an
  67.     //  edit control.  This uses a relatively new API in CTL3D
  68.     //  called Ctl3dSubclassCtlEx.
  69.     pEdit->SubclassCtl3d(CTL3D_EDIT_CTL);
  70.  
  71.     // then call it for this first message
  72. #ifdef STRICT
  73.     return ::CallWindowProc(AfxWndProc, hWnd, msg, wParam, lParam);
  74. #else
  75.     return ::CallWindowProc((FARPROC)AfxWndProc, hWnd, msg, wParam, lParam);
  76. #endif
  77. }
  78.  
  79. BEGIN_MESSAGE_MAP(CParsedEditExported, CParsedEdit)
  80.     //{{AFX_MSG_MAP(CParsedEditExported)
  81.     ON_WM_NCCREATE()
  82.     //}}AFX_MSG_MAP
  83. END_MESSAGE_MAP()
  84.  
  85. int CParsedEditExported::OnNcCreate(LPCREATESTRUCT lpCreateStruct)
  86. {
  87.     // special create hook
  88.     // example of stripping the sub-style bits from the style specified
  89.     //   in the dialog template to use for some other reason
  90.     m_wParseStyle = LOWORD(lpCreateStruct->style);
  91.     DWORD dwEditStyle = MAKELONG(ES_LEFT, HIWORD(lpCreateStruct->style));
  92.  
  93.     ::SetWindowLong(m_hWnd, GWL_STYLE, dwEditStyle);
  94.     lpCreateStruct->style = dwEditStyle;
  95.     return CParsedEdit::OnNcCreate(lpCreateStruct);
  96. }
  97.  
  98. void CParsedEditExported::PostNcDestroy()
  99. {
  100.     // needed to clean up the C++ CWnd object
  101.     delete this;
  102. }
  103.  
  104. /////////////////////////////////////////////////////////////////////////////
  105. // Routine to register the class
  106.  
  107. WNDPROC CParsedEditExported::lpfnSuperEdit = NULL;
  108.  
  109. BOOL CParsedEdit::RegisterControlClass()
  110. {
  111.     WNDCLASS wcls;
  112.  
  113.     // check to see if class already registered
  114.     static const TCHAR szClass[] = _T("paredit");
  115.     if (::GetClassInfo(AfxGetInstanceHandle(), szClass, &wcls))
  116.     {
  117.         // name already registered - ok if it was us
  118.         return (wcls.lpfnWndProc == (WNDPROC)CParsedEditExported::WndProcHook);
  119.     }
  120.  
  121.     // Use standard "edit" control as a template.
  122.     VERIFY(::GetClassInfo(NULL, _T("edit"), &wcls));
  123.     CParsedEditExported::lpfnSuperEdit = wcls.lpfnWndProc;
  124.  
  125.     // set new values
  126.     wcls.lpfnWndProc = CParsedEditExported::WndProcHook;
  127.     wcls.hInstance = AfxGetInstanceHandle();
  128.     wcls.lpszClassName = szClass;
  129.     return (RegisterClass(&wcls) != 0);
  130. }
  131.  
  132. /////////////////////////////////////////////////////////////////////////////
  133.