让DuiLib支持Icon图片显示

DuiLib都支持Bitmap图片,但就不能icon图标,实际上用到Icon的地方还蛮多的,后来自己先办法看能不能写个专门的控件的来显示icon图片(以前看过一篇文章《修改stb_image.c以让Duilib直接支持Ico格式的图标显示》http://www.cnblogs.com/memset/p/dui_with_ico.html,但试过了好像显示有问题,联系作者他也说这中方法有bug,所以大家可以用我这种方法试下,代码比较简单,有待完善的地方欢迎大家联系我 :)) 先定义头文件(直接加到DuiLib的库中)
#pragma once

namespace DuiLib
{
	//
	// CIconUI
	class UILIB_API CIconUI : public DuiLib::CControlUI
	{
		friend class CIconWnd;
	public:
		CIconUI(void);
		~CIconUI(void);

		LPCTSTR	GetClass() const;
		LPVOID	GetInterface(LPCTSTR pstrName);
		void	SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);

		void	SetPos(RECT rc);
		void	SetInset(RECT rc);
		void	SetVisible(bool bVisible);
		void	SetInternVisible(bool bVisible);
		void	DoPaint(HDC hDC, const RECT& rcPaint);
		void    DoEvent(TEventUI& event);
	private:
		DuiLib::CDuiString	m_sIcoImage;
		RECT				m_rcInset;
	};	
}

.cpp文件
#include "StdAfx.h"
#include "IconUI.h"

namespace DuiLib
{
	//
	// CIconUI
	CIconUI::CIconUI(void)
	{
		memset(&m_rcInset, 0, sizeof(m_rcInset));
		SetAttribute(_T("bkcolor"), _T("#00000000"));
	}

	CIconUI::~CIconUI(void)
	{
	}

	LPCTSTR CIconUI::GetClass() const
	{
		return _T("IconUI");
	}

	LPVOID CIconUI::GetInterface(LPCTSTR pstrName)
	{
		if (_tcscmp(pstrName, _T("Icon")) == 0)
			return static_cast(this);
		return __super::GetInterface(pstrName);
	}

	void CIconUI::SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue)
	{
		if(_tcscmp(pstrName, _T("icon")) == 0)
			m_sIcoImage = pstrValue;
		if (_tcscmp(pstrName, _T("inset")) == 0)
		{
			RECT rcInset = { 0 };
			LPTSTR pstr = NULL;
			rcInset.left = _tcstol(pstrValue, &pstr, 10);  ASSERT(pstr);
			rcInset.top = _tcstol(pstr + 1, &pstr, 10);    ASSERT(pstr);
			rcInset.right = _tcstol(pstr + 1, &pstr, 10);  ASSERT(pstr);
			rcInset.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
			SetInset(rcInset);
		}
		Invalidate();
		__super::SetAttribute(pstrName, pstrValue);
	}

	void CIconUI::SetPos(RECT rc)
	{
		CControlUI::SetPos(rc);
	}

	void CIconUI::SetInset(RECT rc)
	{
		m_rcInset = rc;
	}

	void CIconUI::DoEvent(TEventUI& event)
	{
		CControlUI::DoEvent(event);
	

	}

	void CIconUI::SetVisible(bool bVisible)
	{
		CControlUI::SetVisible(bVisible);
	}

	void CIconUI::SetInternVisible(bool bVisible)
	{
		CControlUI::SetInternVisible(bVisible);
		
	}

	void CIconUI::DoPaint(HDC hDC, const RECT& rcPaint)
	{
		RECT rcTemp = { 0 };
		if( !::IntersectRect(&m_rcPaint, &rcPaint, &m_rcItem) ) return;

		HICON hIcon = (HICON)::LoadImage(m_pManager->GetInstance(), m_sIcoImage, IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE | LR_DEFAULTSIZE);
		if (hIcon == NULL)
			hIcon = (HICON)::LoadImage(m_pManager->GetInstance(), m_pManager->GetResourcePath() + _T("\\Favicon\\blank_favicon.ico"), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE | LR_DEFAULTSIZE);
		if (NULL != hIcon)
		{	
			RECT rect;
			rect.left = m_rcItem.left + m_rcInset.left;
			rect.right = m_rcItem.right - m_rcInset.right;
			rect.top = m_rcItem.top + m_rcInset.top;
			rect.bottom = m_rcItem.bottom - m_rcInset.bottom;
			::DrawIconEx(hDC, rect.left, rect.top, hIcon, rect.right - rect.left,
				rect.bottom - rect.top, 0, NULL, DI_NORMAL);
			::DeleteObject(hIcon);
		}
	}

	
}
然后修改下UIlib.h加入库中
#include "Control/UIActiveX.h"
#include "Control/UIWebBrowser.h"
#include "Control/UIFlash.h"

#include "Control/IconUI.h"
在UIDefine.h中加入定义
#define  DUI_CTR_EDIT                            (_T("Edit"))
#define  DUI_CTR_LIST                            (_T("List"))
#define  DUI_CTR_TEXT                            (_T("Text"))
#define  DUI_CTR_ICON                            (_T("Icon"))
最后在UIDlgBuilder.cpp中加入一行代码
else if( _tcscmp(pstrClass, DUI_CTR_LIST) == 0 )              pControl = new CListUI;
else if( _tcscmp(pstrClass, DUI_CTR_TEXT) == 0 )              pControl = new CTextUI;
else if( _tcscmp(pstrClass, DUI_CTR_ICON) == 0 )              pControl = new CIconUI;
这样,就可以像库中的其他控件一样使用CIconUI控件了,在xml中使用Icon标识来就可以使用CIconUI显示图片,然后再设置icon属性(属性后面要写相对于exe的路径,要使用相对于其他资源的路径可以在LoadImage的m_sIcoImage前加m_pManager->GetResourcePath())。

你可能感兴趣的:(DuiLib)