|
|
// paredit2.cpp : code needed to export CParsedEdit as a WndClass
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include "ctrltest.h"
#include "paredit.h"
#include <ctl3d.h>
/////////////////////////////////////////////////////////////////////////////
// The C++ class CParsedEdit can be made visible to the dialog manager
// by registering a window class for it
// The C++ class 'CParsedEditExported' is used to implement the
// creation and destruction of a C++ object as if it were just
// a normal Windows control.
// In order to hook in the class creation we must provide a special
// WndProc to create the C++ object and override the PostNcDestroy
// message to destroy it
class CParsedEditExported : public CParsedEdit // WNDCLASS exported class
{ public: CParsedEditExported() { }; BOOL RegisterControlClass();
// Implementation: (all is implementation since the public interface of
// this class is identical to CParsedEdit)
protected: virtual void PostNcDestroy(); static LRESULT CALLBACK EXPORT WndProcHook(HWND, UINT, WPARAM, LPARAM); static WNDPROC lpfnSuperEdit;
friend class CParsedEdit; // for RegisterControlClass
//{{AFX_MSG(CParsedEditExported)
afx_msg int OnNcCreate(LPCREATESTRUCT lpCreateStruct); //}}AFX_MSG
DECLARE_MESSAGE_MAP(); };
/////////////////////////////////////////////////////////////////////////////
// Special create hooks
LRESULT CALLBACK EXPORT CParsedEditExported::WndProcHook(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { // create new item and attach it
CParsedEditExported* pEdit = new CParsedEditExported(); pEdit->Attach(hWnd);
// set up wndproc to AFX one, and call it
pEdit->m_pfnSuper = CParsedEditExported::lpfnSuperEdit; ::SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)AfxWndProc);
// Since this window is really an edit control but does not
// have "edit" as its class name, to make it work correctly
// with CTL3D, we have to tell CTL3D that is "really is" an
// edit control. This uses a relatively new API in CTL3D
// called Ctl3dSubclassCtlEx.
pEdit->SubclassCtl3d(CTL3D_EDIT_CTL);
// then call it for this first message
#ifdef STRICT
return ::CallWindowProc(AfxWndProc, hWnd, msg, wParam, lParam); #else
return ::CallWindowProc((FARPROC)AfxWndProc, hWnd, msg, wParam, lParam); #endif
}
BEGIN_MESSAGE_MAP(CParsedEditExported, CParsedEdit) //{{AFX_MSG_MAP(CParsedEditExported)
ON_WM_NCCREATE() //}}AFX_MSG_MAP
END_MESSAGE_MAP()
int CParsedEditExported::OnNcCreate(LPCREATESTRUCT lpCreateStruct) { // special create hook
// example of stripping the sub-style bits from the style specified
// in the dialog template to use for some other reason
m_wParseStyle = LOWORD(lpCreateStruct->style); DWORD dwEditStyle = MAKELONG(ES_LEFT, HIWORD(lpCreateStruct->style));
::SetWindowLong(m_hWnd, GWL_STYLE, dwEditStyle); lpCreateStruct->style = dwEditStyle; return CParsedEdit::OnNcCreate(lpCreateStruct); }
void CParsedEditExported::PostNcDestroy() { // needed to clean up the C++ CWnd object
delete this; }
/////////////////////////////////////////////////////////////////////////////
// Routine to register the class
WNDPROC CParsedEditExported::lpfnSuperEdit = NULL;
BOOL CParsedEdit::RegisterControlClass() { WNDCLASS wcls;
// check to see if class already registered
static const TCHAR szClass[] = _T("paredit"); if (::GetClassInfo(AfxGetInstanceHandle(), szClass, &wcls)) { // name already registered - ok if it was us
return (wcls.lpfnWndProc == (WNDPROC)CParsedEditExported::WndProcHook); }
// Use standard "edit" control as a template.
VERIFY(::GetClassInfo(NULL, _T("edit"), &wcls)); CParsedEditExported::lpfnSuperEdit = wcls.lpfnWndProc;
// set new values
wcls.lpfnWndProc = CParsedEditExported::WndProcHook; wcls.hInstance = AfxGetInstanceHandle(); wcls.lpszClassName = szClass; return (RegisterClass(&wcls) != 0); }
/////////////////////////////////////////////////////////////////////////////
|