Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

128 lines
3.0 KiB

/*--------------------------------------------------------------------------*
*
* Microsoft Windows
* Copyright (C) Microsoft Corporation, 1992 - 1999
*
* File: subclass.h
*
* Contents: Interface file for the dynamic subclass manager
*
* History: 06-May-98 JeffRo Created
*
*--------------------------------------------------------------------------*/
#ifndef __SUBCLASS_H__
#define __SUBCLASS_H__
#pragma once
// remove the definition from windowsx.h that conflicts with declarations here
#ifdef SubclassWindow
#undef SubclassWindow
#endif
/*--------------------------------------------------------------------------*
* CSubclasser
*
* Derive a class from this to implement subclassing the subclass manager
* way.
*--------------------------------------------------------------------------*/
class CSubclasser
{
public:
virtual ~CSubclasser() {}
virtual LRESULT Callback (HWND& hwnd, UINT& msg, WPARAM& wParam,
LPARAM& lParam, bool& fPassMessageOn) = 0;
};
/*----------------*/
/* SubclasserData */
/*----------------*/
class SubclasserData
{
public:
SubclasserData (CSubclasser* pSubclasser_ = NULL, HWND hwnd = NULL)
: pSubclasser (pSubclasser_),
hwnd (hwnd),
cRefs (0),
fZombie (false)
{}
UINT AddRef ()
{ return (++cRefs); }
UINT Release ()
{ ASSERT (cRefs > 0); return (--cRefs); }
bool operator==(const SubclasserData& other) const
{ return (pSubclasser == other.pSubclasser); }
bool operator<(const SubclasserData& other) const
{ return (pSubclasser < other.pSubclasser); }
CSubclasser* pSubclasser;
private:
friend class WindowContext;
HWND hwnd;
UINT cRefs;
bool fZombie;
};
typedef std::list<SubclasserData> SubclasserList;
typedef std::set< SubclasserData> SubclasserSet;
/*---------------*/
/* WindowContext */
/*---------------*/
class WindowContext
{
public:
WindowContext() : pfnOriginalWndProc(NULL)
{}
bool IsZombie(const SubclasserData& subclasser) const;
void Insert(SubclasserData& subclasser);
UINT Remove(SubclasserData& subclasser);
void RemoveZombies();
SubclasserList Subclassers;
WNDPROC pfnOriginalWndProc;
private:
void Zombie(SubclasserData& subclasser, bool fZombie);
SubclasserSet Zombies;
};
/*------------------*/
/* CSubclassManager */
/*------------------*/
class CSubclassManager
{
public:
bool SubclassWindow (HWND hwnd, CSubclasser* pSubclasser);
bool UnsubclassWindow (HWND hwnd, CSubclasser* pSubclasser);
private:
typedef std::map<HWND, WindowContext> ContextMap;
ContextMap m_ContextMap;
bool PhysicallyUnsubclassWindow (HWND hwnd, bool fForce = false);
LRESULT SubclassProcWorker (HWND, UINT, WPARAM, LPARAM);
static LRESULT CALLBACK SubclassProc (HWND, UINT, WPARAM, LPARAM);
};
CSubclassManager& GetSubclassManager();
#endif /* __SUBCLASS_H__ */