• 应用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
  • 相关阅读:
    Openstack 学习资源
    Linux 中的 Network服务 与NetworkManager
    解决Eclipse +pydev 中python import 代码提示错误问题
    JSON格式化工具推荐
    python 中json库的 对象转换问题
    使用SmartOS做为Openstack 基础操作系统(简译)
    使用PYTHON ZSI 开发WebService
    VirtualBox 虚拟机硬盘缓存与系统虚拟缓存对性能的影响测试。
    关于使用Django admin模块插入中文时乱码的处理方法
    Linux 和 SmartOS 命令对比
  • 原文地址:https://www.cnblogs.com/fangkm/p/1434562.html
Copyright © 2020-2023  润新知