应用SetProp等API设置HWND的属性表

做GUI时经常需要让控件或者控件的每个Item附带一些数据.ListCtrl和TreeCtrl等复杂的控件都有类似于SetItem之类的API函数可以附加自己的数据.对于窗口句柄HWND,也有类似的函数,就是SetProp、GetProp等API。具体使用MSDN有详细的介绍和例子。下面我为方便使用而对其进行简要地封装.
#ifndef   _WINDOW_PROP_H_
#define  _WINDOW_PROP_H_

/*
*  封装API函数SetProp、GetProp、EnumPropsEx、RemoveProp
*  用于管理窗口的属性
*/
class  CWindowProp
{
private:
    
//保存需要设置的窗口句柄
    HWND  m_hWnd;

public:
    CWindowProp( HWND hWnd 
= NULL )
    {
        
this->m_hWnd  =  hWnd;
    }

    CWindowProp
& operator=( HWND hWnd )
    {
        
this->m_hWnd = hWnd;
        
return *this;
    }

    
/*
    * 设置属性值
    * lpszName: 属性key
    * hData: 值句柄
    * Return: 返回成功与否
    
*/
    BOOL  SetProperty(  LPCTSTR lpszName, HANDLE hData )
    {
        ATLASSERT( ::IsWindow( 
this->m_hWnd ) );
        
return ::SetProp( this->m_hWnd, lpszName, hData );
    }

    
/*
    * 获取属性值
    * lpszName: 属性key
    * Return: lpszName对应的值,若不存在返回NULL
    
*/
    HANDLE  GetProperty( LPCTSTR lpszName )
    {
        ATLASSERT( ::IsWindow( 
this->m_hWnd ) );
        
return ::GetProp( this->m_hWnd, lpszName );
    }

    
/*
    * 删除属性值
    * lpszName: 属性key
    * Return: lpszName对应的值,若不存在返回NULL
    
*/
    HANDLE  RemoveProperty( LPCTSTR lpszName )
    {
        ATLASSERT( ::IsWindow( 
this->m_hWnd ) );
        
return  ::RemoveProp(  this->m_hWnd, lpszName );
    }

    
/*
    * 枚举属性列表
    
*/
    BOOL EnumerateProperties( PROPENUMPROCEX pfnProc, LPARAM lParam)
    {
        ATLASSERT( ::IsWindow( 
this->m_hWnd ) );
        ATLASSERT( 
!::IsBadCodePtr( (FARPROC)pfnProc ) );
        
return ::EnumPropsEx( this->m_hWnd, pfnProc, lParam) != -1;
    }  

    
/*
    *  删除所有的属性列表
    
*/
    
void RemoveAll()
    {
        ATLASSERT( ::IsWindow( 
this->m_hWnd ) );
        ::EnumPropsEx( 
this->m_hWnd, sRemoveAllProc, 0 ); 
    }

private:
    
static BOOL CALLBACK sRemoveAllProc( HWND hWnd, LPTSTR lpszName, HANDLE hData, ULONG_PTR dwData )
    {
        ::RemoveProp( hWnd, lpszName );
        
return TRUE;
    }

};

#endif
posted @ 2009-04-13 11:14  孤竹君  阅读(1302)  评论(0编辑  收藏  举报