让DuiLib支持Icon图片显示

DuiLib都支持Bitmap图片,但就不能icon图标,实际上用到Icon的地方还蛮多的,后来自己先办法看能不能写个专门的控件的来显示icon图片(以前看过一篇文章《修改stb_image.c以让Duilib直接支持Ico格式的图标显示》http://www.cnblogs.com/memset/p/dui_with_ico.html,但试过了好像显示有问题,联系作者他也说这中方法有bug,所以大家可以用我这种方法试下,代码比较简单,有待完善的地方欢迎大家联系我 :)) 先定义头文件(直接加到DuiLib的库中)
[cpp]  view plain copy
  1. #pragma once  
  2.   
  3. namespace DuiLib  
  4. {  
  5.     //  
  6.     // CIconUI  
  7.     class UILIB_API CIconUI : public DuiLib::CControlUI  
  8.     {  
  9.         friend class CIconWnd;  
  10.     public:  
  11.         CIconUI(void);  
  12.         ~CIconUI(void);  
  13.   
  14.         LPCTSTR GetClass() const;  
  15.         LPVOID  GetInterface(LPCTSTR pstrName);  
  16.         void    SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);  
  17.   
  18.         void    SetPos(RECT rc);  
  19.         void    SetInset(RECT rc);  
  20.         void    SetVisible(bool bVisible);  
  21.         void    SetInternVisible(bool bVisible);  
  22.         void    DoPaint(HDC hDC, const RECT& rcPaint);  
  23.         void    DoEvent(TEventUI& event);  
  24.     private:  
  25.         DuiLib::CDuiString  m_sIcoImage;  
  26.         RECT                m_rcInset;  
  27.     };    
  28. }  
.cpp文件
[cpp]  view plain copy
  1. #include "StdAfx.h"  
  2. #include "IconUI.h"  
  3.   
  4. namespace DuiLib  
  5. {  
  6.     //  
  7.     // CIconUI  
  8.     CIconUI::CIconUI(void)  
  9.     {  
  10.         memset(&m_rcInset, 0, sizeof(m_rcInset));  
  11.         SetAttribute(_T("bkcolor"), _T("#00000000"));  
  12.     }  
  13.   
  14.     CIconUI::~CIconUI(void)  
  15.     {  
  16.     }  
  17.   
  18.     LPCTSTR CIconUI::GetClass() const  
  19.     {  
  20.         return _T("IconUI");  
  21.     }  
  22.   
  23.     LPVOID CIconUI::GetInterface(LPCTSTR pstrName)  
  24.     {  
  25.         if (_tcscmp(pstrName, _T("Icon")) == 0)  
  26.             return static_cast<ciconui>(this);  
  27.         return __super::GetInterface(pstrName);  
  28.     }  
  29.   
  30.     void CIconUI::SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue)  
  31.     {  
  32.         if(_tcscmp(pstrName, _T("icon")) == 0)  
  33.             m_sIcoImage = pstrValue;  
  34.         if (_tcscmp(pstrName, _T("inset")) == 0)  
  35.         {  
  36.             RECT rcInset = { 0 };  
  37.             LPTSTR pstr = NULL;  
  38.             rcInset.left = _tcstol(pstrValue, &pstr, 10);  ASSERT(pstr);  
  39.             rcInset.top = _tcstol(pstr + 1, &pstr, 10);    ASSERT(pstr);  
  40.             rcInset.right = _tcstol(pstr + 1, &pstr, 10);  ASSERT(pstr);  
  41.             rcInset.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);  
  42.             SetInset(rcInset);  
  43.         }  
  44.         Invalidate();  
  45.         __super::SetAttribute(pstrName, pstrValue);  
  46.     }  
  47.   
  48.     void CIconUI::SetPos(RECT rc)  
  49.     {  
  50.         CControlUI::SetPos(rc);  
  51.     }  
  52.   
  53.     void CIconUI::SetInset(RECT rc)  
  54.     {  
  55.         m_rcInset = rc;  
  56.     }  
  57.   
  58.     void CIconUI::DoEvent(TEventUI& event)  
  59.     {  
  60.         CControlUI::DoEvent(event);  
  61.       
  62.   
  63.     }  
  64.   
  65.     void CIconUI::SetVisible(bool bVisible)  
  66.     {  
  67.         CControlUI::SetVisible(bVisible);  
  68.     }  
  69.   
  70.     void CIconUI::SetInternVisible(bool bVisible)  
  71.     {  
  72.         CControlUI::SetInternVisible(bVisible);  
  73.           
  74.     }  
  75.   
  76.     void CIconUI::DoPaint(HDC hDC, const RECT& rcPaint)  
  77.     {  
  78.         RECT rcTemp = { 0 };  
  79.         if( !::IntersectRect(&m_rcPaint, &rcPaint, &m_rcItem) ) return;  
  80.   
  81.         HICON hIcon = (HICON)::LoadImage(m_pManager->GetInstance(), m_sIcoImage, IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE | LR_DEFAULTSIZE);  
  82.         if (hIcon == NULL)  
  83.             hIcon = (HICON)::LoadImage(m_pManager->GetInstance(), m_pManager->GetResourcePath() + _T("\\Favicon\\blank_favicon.ico"), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE | LR_DEFAULTSIZE);  
  84.         if (NULL != hIcon)  
  85.         {     
  86.             RECT rect;  
  87.             rect.left = m_rcItem.left + m_rcInset.left;  
  88.             rect.right = m_rcItem.right - m_rcInset.right;  
  89.             rect.top = m_rcItem.top + m_rcInset.top;  
  90.             rect.bottom = m_rcItem.bottom - m_rcInset.bottom;  
  91.             ::DrawIconEx(hDC, rect.left, rect.top, hIcon, rect.right - rect.left,  
  92.                 rect.bottom - rect.top, 0, NULL, DI_NORMAL);  
  93.             ::DeleteObject(hIcon);  
  94.         }  
  95.     }  
  96.   
  97.       
  98. }  
  99. </ciconui>  
然后修改下UIlib.h加入库中
[cpp]  view plain copy
  1. #include "Control/UIActiveX.h"  
  2. #include "Control/UIWebBrowser.h"  
  3. #include "Control/UIFlash.h"  
  4.   
  5. #include "Control/IconUI.h"  
在UIDefine.h中加入定义
[cpp]  view plain copy
  1. #define  DUI_CTR_EDIT                            (_T("Edit"))  
  2. #define  DUI_CTR_LIST                            (_T("List"))  
  3. #define  DUI_CTR_TEXT                            (_T("Text"))  
  4. #define  DUI_CTR_ICON                            (_T("Icon"))  
最后在UIDlgBuilder.cpp中加入一行代码
[cpp]  view plain copy
  1. else if( _tcscmp(pstrClass, DUI_CTR_LIST) == 0 )              pControl = new CListUI;  
  2. else if( _tcscmp(pstrClass, DUI_CTR_TEXT) == 0 )              pControl = new CTextUI;  
  3. else if( _tcscmp(pstrClass, DUI_CTR_ICON) == 0 )              pControl = new CIconUI;  
 这样,就可以像库中的其他控件一样使用CIconUI控件了,在xml中使用Icon标识来就可以使用CIconUI显示图片,然后再设置icon属性(属性后面要写相对于exe的路径,要使用相对于其他资源的路径可以在LoadImage的m_sIcoImage前加m_pManager->GetResourcePath())。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值