应用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

你可能感兴趣的:(set)