duilib 可编辑ComboBox

直接贴码

头文件

#ifndef __UICOMBOBOXEx_H__
#define __UICOMBOBOXEx_H__

#pragma once

namespace DuiLib
{
	/*********编辑框************/
	class CComboEditWnd;
	/***********下拉列表***************/
	class CComboDownWnd;
	class CComboBoxExUI : public CContainerUI, public IListOwnerUI
	{
		friend class CComboEditWnd;
		friend class CComboDownWnd;
	public:
		CComboBoxExUI();
		//条目发生改变信号
		sigslot::signal2<int,CComboBoxExUI *> SignalItemChange;

		LPCTSTR GetClass() const;
		LPVOID GetInterface(LPCTSTR pstrName);

		void DoInit();
		UINT GetControlFlags() const;

		CDuiString GetText() const;
		void SetEnabled(bool bEnable = true);

		CDuiString GetDropBoxAttributeList();
		void SetDropBoxAttributeList(LPCTSTR pstrList);
		SIZE GetDropBoxSize() const;
		void SetDropBoxSize(SIZE szDropBox);

		int GetCurSel() const;  
		bool SelectItem(int iIndex, bool bTakeFocus = false);

		bool SetItemIndex(CControlUI* pControl, int iIndex);
		bool Add(CControlUI* pControl);
		bool AddAt(CControlUI* pControl, int iIndex);
		bool Remove(CControlUI* pControl);
		bool RemoveAt(int iIndex);
		void RemoveAll();

		bool Activate();

		RECT GetTextPadding() const;
		void SetTextPadding(RECT rc);
		LPCTSTR GetNormalImage() const;
		void SetNormalImage(LPCTSTR pStrImage);
		LPCTSTR GetHotImage() const;
		void SetHotImage(LPCTSTR pStrImage);
		LPCTSTR GetPushedImage() const;
		void SetPushedImage(LPCTSTR pStrImage);
		LPCTSTR GetFocusedImage() const;
		void SetFocusedImage(LPCTSTR pStrImage);
		LPCTSTR GetDisabledImage() const;
		void SetDisabledImage(LPCTSTR pStrImage);

		TListInfoUI* GetListInfo();
		void SetItemFont(int index);
		void SetItemTextStyle(UINT uStyle);
		RECT GetItemTextPadding() const;
		void SetItemTextPadding(RECT rc);
		DWORD GetItemTextColor() const;
		void SetItemTextColor(DWORD dwTextColor);
		DWORD GetItemBkColor() const;
		void SetItemBkColor(DWORD dwBkColor);
		LPCTSTR GetItemBkImage() const;
		void SetItemBkImage(LPCTSTR pStrImage);
		bool IsAlternateBk() const;
		void SetAlternateBk(bool bAlternateBk);
		DWORD GetSelectedItemTextColor() const;
		void SetSelectedItemTextColor(DWORD dwTextColor);
		DWORD GetSelectedItemBkColor() const;
		void SetSelectedItemBkColor(DWORD dwBkColor);
		LPCTSTR GetSelectedItemImage() const;
		void SetSelectedItemImage(LPCTSTR pStrImage);
		DWORD GetHotItemTextColor() const;
		void SetHotItemTextColor(DWORD dwTextColor);
		DWORD GetHotItemBkColor() const;
		void SetHotItemBkColor(DWORD dwBkColor);
		LPCTSTR GetHotItemImage() const;
		void SetHotItemImage(LPCTSTR pStrImage);
		DWORD GetDisabledItemTextColor() const;
		void SetDisabledItemTextColor(DWORD dwTextColor);
		DWORD GetDisabledItemBkColor() const;
		void SetDisabledItemBkColor(DWORD dwBkColor);
		LPCTSTR GetDisabledItemImage() const;
		void SetDisabledItemImage(LPCTSTR pStrImage);
		DWORD GetItemLineColor() const;
		void SetItemLineColor(DWORD dwLineColor);
		bool IsItemShowHtml();
		void SetItemShowHtml(bool bShowHtml = true);

		SIZE EstimateSize(SIZE szAvailable);
		void SetPos(RECT rc);
		void DoEvent(TEventUI& event);
		void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);
    
		void DoPaint(HDC hDC, const RECT& rcPaint);
		void PaintText(HDC hDC);
		void PaintStatusImage(HDC hDC);
		
	protected:
				CComboEditWnd *p_EditWnd;
				CComboDownWnd* m_pWindow;
				int m_iCurSel;
				RECT m_rcTextPadding;
				CDuiString m_sDropBoxAttributes;
				SIZE m_szDropBox;
				UINT m_uButtonState;

				CDuiString m_sNormalImage;
				CDuiString m_sHotImage;
				CDuiString m_sPushedImage;
				CDuiString m_sFocusedImage;
				CDuiString m_sDisabledImage;

				TListInfoUI m_ListInfo;
	};
}

#endif // __UICOMBOBOX_H__

源文件:

#include "stdafx.h"
#include "..\stdafx.h"
#include "UIComboBoxEx.h"

namespace DuiLib
{
	#define lengthof(x) (sizeof(x)/sizeof(*x))
	#define MAX max
	#define MIN min
	#define CLAMP(x,a,b) (MIN(b,MAX(a,x)))

    #define Arrw 20;
	class CComboEditWnd : public CWindowWnd
	{
		public:
				CComboEditWnd();
				void Init(CComboBoxExUI* pOwner);
				RECT CalPos();

				LPCTSTR GetWindowClassName() const;
				LPCTSTR GetSuperClassName() const;
				void OnFinalMessage(HWND hWnd);

				LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
				LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
				LRESULT OnEditChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
				LRESULT OnEditUpdate(UINT uMsg/**/, WPARAM wParam/**/, LPARAM lParam/**/, BOOL& bHandled/**/);
		protected:
				CComboBoxExUI* m_pOwner;
				HBRUSH m_hBkBrush;
				bool m_bInit;
				int l1;
				int l2;
	};


	CComboEditWnd::CComboEditWnd() : m_pOwner(NULL), m_hBkBrush(NULL), m_bInit(false)
	{
	}
	/*****************************************下拉列表*****************************************************************/
	class CComboDownWnd : public CWindowWnd,public INotifyUI
	{
		public:
			void Init(CComboBoxExUI* pOwner);
			LPCTSTR GetWindowClassName() const;
			void OnFinalMessage(HWND hWnd);

			LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);

			void EnsureVisible(int iIndex);
			void Scroll(int dx, int dy);

		#if(_WIN32_WINNT >= 0x0501)
			virtual UINT GetClassStyle() const;
		#endif

		public:
			CPaintManagerUI m_pm;
			CComboBoxExUI* m_pOwner;
			CVerticalLayoutUI* m_pLayout;
			int m_iOldSel;
			void Notify(TNotifyUI& msg);
	};
	
	void CComboEditWnd::Init(CComboBoxExUI* pOwner)
	{
		m_pOwner = pOwner;
		RECT rcPos = CalPos();
		UINT uStyle = WS_CHILD | ES_AUTOHSCROLL;//
		Create(m_pOwner->GetManager()->GetPaintWindow(), NULL, uStyle, 0, rcPos);
		HFONT hFont=NULL;
		int index=m_pOwner->GetCurSel();
		if(index>-1)
		{
		
		}
		int iFontIndex=m_pOwner->GetListInfo()->nFont;
		if (iFontIndex!=-1)
			hFont=m_pOwner->GetManager()->GetFont(iFontIndex);
		if (hFont==NULL)
			hFont=m_pOwner->GetManager()->GetDefaultFontInfo()->hFont;

		SetWindowFont(m_hWnd, hFont, TRUE);
		Edit_LimitText(m_hWnd,30);
		
		Edit_SetText(m_hWnd, m_pOwner->GetText());

		Edit_SetModify(m_hWnd, false);

		SendMessage(EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELPARAM(0, 0));
		Edit_Enable(m_hWnd,true);
	    Edit_SetReadOnly(m_hWnd,false);
		//Styls
		LONG styleValue =::GetWindowLong(m_hWnd, GWL_STYLE);
		styleValue =styleValue |ES_LEFT ;
		::SetWindowLong(GetHWND(), GWL_STYLE, styleValue);
		//styleValue |= pOwner->GetWindowStyls();
		::ShowWindow(m_hWnd, SW_SHOWNOACTIVATE);

		::SetFocus(m_hWnd);
		//::SetCapture(m_hWnd);
		//Edit_SetSel(m_hWnd, 0,-1);
		m_bInit = true;    
		//::SetTimer(m_hWnd,1010,100,NULL);
		 //TRACKMOUSEEVENT   tme;     
		 // tme.cbSize = sizeof(tme);     
		 // tme.dwFlags = TME_LEAVE | TME_NONCLIENT; //注册非客户区离开    
		 // tme.hwndTrack = m_hWnd;     
		 // tme.dwHoverTime = HOVER_DEFAULT; //只对HOVER有效  
		 // ::TrackMouseEvent(&tme); 
	}

	RECT CComboEditWnd::CalPos()
	{
		CDuiRect rcPos = m_pOwner->GetPos();
		RECT rcInset = m_pOwner->GetTextPadding();
		rcPos.left += rcInset.left;
		rcPos.top += rcInset.top;
		rcPos.right -= rcInset.right+Arrw;
		rcPos.bottom -= rcInset.bottom;

		LONG lEditHeight = m_pOwner->GetManager()->GetFontInfo(m_pOwner->GetListInfo()->nFont)->tm.tmHeight;
		if( lEditHeight < rcPos.GetHeight() ) 
		{
			rcPos.top += (rcPos.GetHeight() - lEditHeight) / 2;
			rcPos.bottom = rcPos.top + lEditHeight;
		}
		return rcPos;
	}

	LPCTSTR CComboEditWnd::GetWindowClassName() const
	{
		return _T("EditWnd");
	}

	LPCTSTR CComboEditWnd::GetSuperClassName() const
	{
		return WC_EDIT;
	}

	void CComboEditWnd::OnFinalMessage(HWND /*hWnd*/)
	{
		m_pOwner->Invalidate();
		// Clear reference and die
		if( m_hBkBrush != NULL ) ::DeleteObject(m_hBkBrush);
		m_pOwner->p_EditWnd = NULL;
		delete this;
	}

	LRESULT CComboEditWnd::OnEditUpdate(UINT uMsg/**/, WPARAM wParam/**/, LPARAM lParam/**/, BOOL& bHandled/**/)
	{
	//	return 1;
	    int cchLen = ::GetWindowTextLength(m_hWnd) + 1;
		#ifndef  _UNICODE
			LPTSTR pstr = static_cast<LPTSTR>(_alloca(cchLen * sizeof(TCHAR)));
		    LPTSTR pstr2 = static_cast<LPTSTR>(_alloca(cchLen * sizeof(TCHAR)));
		#else
			LPTSTR pstr = static_cast<LPTSTR>(_alloca(cchLen * sizeof(wchar_t)));
		    LPTSTR pstr2 = static_cast<LPTSTR>(_alloca(cchLen * sizeof(wchar_t)));
		#endif
		
		memset(pstr2,0,cchLen);
		ASSERT(pstr);
		if( pstr == NULL ) return 0;
		::GetWindowText(m_hWnd, pstr, cchLen);
		

		int count=this->m_pOwner->GetCount();
		bool findOk=false;
		for(int i=0;i<count;i++)
		{
			CDuiString bb(this->m_pOwner->GetItemAt(i)->GetText());
			if(bb.Find(pstr)>=0)
			{
				this->m_pOwner->GetItemAt(i)->SetVisible(true);
				if(!findOk)
				this->m_pOwner->SelectItem(i);
				findOk=true;
			}else
			{
			   this->m_pOwner->GetItemAt(i)->SetVisible(false);
			}
		}

		for(int i=0;i<count&&!findOk;i++)
		{
			this->m_pOwner->GetItemAt(i)->SetVisible(true);
		}
		if(count>0&&!findOk||cchLen<=1)
		{
			this->m_pOwner->SelectItem(0);
		}
		if(count>0)
		{
			// Position the popup window in absolute space
			SIZE szDrop = m_pOwner->GetDropBoxSize();
			RECT rcOwner = m_pOwner->m_pWindow->m_pOwner->GetPos();
			RECT rc = rcOwner;
			rc.top = rc.bottom;		// 父窗口left、bottom位置作为弹出窗口起点
			rc.bottom = rc.top + szDrop.cy;	// 计算弹出窗口高度
			if( szDrop.cx > 0 ) rc.right = rc.left + szDrop.cx;	// 计算弹出窗口宽度

			SIZE szAvailable = { rc.right - rc.left, rc.bottom - rc.top };
			int cyFixed = 0;
			for( int it = 0; it < this->m_pOwner->GetCount(); it++ ) 
			{
				CControlUI* pControl = static_cast<CControlUI*>(m_pOwner->GetItemAt(it));
				if( !pControl->IsVisible() ) 
					continue;
				SIZE sz = pControl->EstimateSize(szAvailable);
				cyFixed += sz.cy;
			}
			cyFixed += 4; // CVerticalLayoutUI 默认的Inset 调整
			rc.bottom = rc.top + MIN(cyFixed, szDrop.cy);
			m_pOwner->m_pWindow->ResizeClient(rc.right-rc.left,rc.bottom-rc.top);
			::MapWindowRect(m_pOwner->m_pWindow->m_pOwner->GetManager()->GetPaintWindow(), HWND_DESKTOP, &rc);
		}
		return 1;
	}
	LRESULT CComboEditWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
	{
		//return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
		LRESULT lRes = 0;
		BOOL bHandled = TRUE;
		
		if(uMsg ==WM_LBUTTONDOWN)
		{
			if(wParam==MK_LBUTTON)
			{
				//if(wParam=MK_LBUTTON)
				{
					  POINT pt;
					  pt.x = GET_X_LPARAM(lParam); 
					  pt.y = GET_Y_LPARAM(lParam); 
					  DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_CHARFROMPOS, 0, MAKELPARAM(pt.x, pt.y));
					  int     nStartChar=(int)(short)LOWORD(dwRet);
					  int  nEndChar=(int)(short)LOWORD(dwRet);
					  l1=nEndChar;
					 
						//设置光标位置
					  ::SendMessage(m_hWnd,EM_SETSEL,nStartChar,nEndChar);
				}
			}
		}
		if(uMsg ==WM_MOUSEMOVE )
		{
		    /*if(wParam==MK_LBUTTON)
			{
                  POINT pt;
				  pt.x = GET_X_LPARAM(lParam); 
				  pt.y = GET_Y_LPARAM(lParam); 
				  DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_CHARFROMPOS, 0, MAKELPARAM(pt.x, pt.y));
		          int     nStartChar=(int)(short)LOWORD(dwRet);
				  int  nEndChar=(int)(short)LOWORD(dwRet);
				  l2=nEndChar;
				  if(l2>l1)
			          ::SendMessage(m_hWnd,EM_SETSEL,l1,l2);
				  else
					  if(l2<l1)
					  ::SendMessage(m_hWnd,EM_SETSEL,l2,l1);
			}*/
		}
		if( uMsg == WM_KILLFOCUS ) 
		{
			lRes = OnKillFocus(uMsg, wParam, lParam, bHandled);
		}
		else 
			if( uMsg == OCM_COMMAND ) 
			{
				/*************字符已经改变了****************/
				if( GET_WM_COMMAND_CMD(wParam, lParam) == EN_CHANGE ) 
					lRes = OnEditChanged(uMsg, wParam, lParam, bHandled);
				else 
					if( GET_WM_COMMAND_CMD(wParam, lParam) == EN_UPDATE )
					{
						 OnEditUpdate(uMsg/**/,wParam/**/, lParam/**/, bHandled/**/);
					}
			}else 
				 if( uMsg == WM_KEYDOWN)
				 {
					    switch( wParam )
						{
							case VK_RETURN:
											::PostMessage(m_hWnd,WM_CLOSE,0,0);
											return 1;
											break;
							case VK_UP:
							case VK_DOWN:
										TEventUI event;
										event.Type = UIEVENT_KEYDOWN;
										event.chKey = (TCHAR)wParam;
										m_pOwner->DoEvent(event);
										if(wParam!=17)
											m_pOwner->m_pWindow->EnsureVisible(m_pOwner->GetCurSel());
										break;
					     }
						bHandled = FALSE;
				 }else 
					if( uMsg == OCM__BASE + WM_CTLCOLOREDIT  || uMsg == OCM__BASE + WM_CTLCOLORSTATIC )
					{
						::SetBkMode((HDC)wParam, TRANSPARENT);
						DWORD dwTextColor = m_pOwner->GetListInfo()->dwTextColor;
						::SetTextColor((HDC)wParam, RGB(GetBValue(dwTextColor),GetGValue(dwTextColor),GetRValue(dwTextColor)));
						if( m_hBkBrush == NULL ) 
						{
							DWORD clrColor = RGB(255,255,255);//m_pOwner->GetBkColor();
							m_hBkBrush = ::CreateSolidBrush(RGB(GetBValue(clrColor), GetGValue(clrColor), GetRValue(clrColor)));
						}
						return (LRESULT)m_hBkBrush;
					}else{
						bHandled = FALSE;
					}
		if( !bHandled ) 
			return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
		return lRes;
	}

	LRESULT CComboEditWnd::OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		::OutputDebugStringA(_T("WM_KILLFOCUS\n"));
		if(this->m_pOwner->m_pWindow!=NULL&&(HWND) wParam!=m_pOwner->m_pWindow->GetHWND())
		{
			    ::SendMessageA(this->m_pOwner->m_pWindow->GetHWND(),WM_CLOSE,0,0);
				this->m_pOwner->m_pWindow=NULL;
		}
		LRESULT lRes = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
		PostMessage(WM_CLOSE);
		this->m_pOwner->p_EditWnd=NULL;
		return lRes;
	}

	LRESULT CComboEditWnd::OnEditChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		if( !m_bInit ) 
			return 0;
		if( m_pOwner == NULL ) 
			return 0;
		return 0;
	}



	
	


	void CComboDownWnd::Init(CComboBoxExUI* pOwner)
	{
		m_pOwner = pOwner;
		m_pLayout = NULL;
		m_iOldSel = m_pOwner->GetCurSel();

		// Position the popup window in absolute space
		SIZE szDrop = m_pOwner->GetDropBoxSize();
		RECT rcOwner = pOwner->GetPos();
		RECT rc = rcOwner;
		rc.top = rc.bottom;		// 父窗口left、bottom位置作为弹出窗口起点
		rc.bottom = rc.top + szDrop.cy;	// 计算弹出窗口高度
		if( szDrop.cx > 0 ) rc.right = rc.left + szDrop.cx;	// 计算弹出窗口宽度

		SIZE szAvailable = { rc.right - rc.left, rc.bottom - rc.top };
		int cyFixed = 0;
		for( int it = 0; it < pOwner->GetCount(); it++ ) {
			CControlUI* pControl = static_cast<CControlUI*>(pOwner->GetItemAt(it));
			if( !pControl->IsVisible() ) continue;
			SIZE sz = pControl->EstimateSize(szAvailable);
			cyFixed += sz.cy;
		}
		cyFixed += 4; // CVerticalLayoutUI 默认的Inset 调整
		rc.bottom = rc.top + MIN(cyFixed, szDrop.cy);

		::MapWindowRect(pOwner->GetManager()->GetPaintWindow(), HWND_DESKTOP, &rc);

		MONITORINFO oMonitor = {};
		oMonitor.cbSize = sizeof(oMonitor);
		::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTOPRIMARY), &oMonitor);
		CDuiRect rcWork = oMonitor.rcWork;
		if( rc.bottom > rcWork.bottom ) {
			rc.left = rcOwner.left;
			rc.right = rcOwner.right;
			if( szDrop.cx > 0 ) rc.right = rc.left + szDrop.cx;
			rc.top = rcOwner.top - MIN(cyFixed, szDrop.cy);
			rc.bottom = rcOwner.top;
			::MapWindowRect(pOwner->GetManager()->GetPaintWindow(), HWND_DESKTOP, &rc);
		}
    
		Create(pOwner->GetManager()->GetPaintWindow(), NULL, WS_POPUP, WS_EX_TOOLWINDOW, rc);
		// HACK: Don't deselect the parent's caption
		HWND hWndParent = m_hWnd;
		while( ::GetParent(hWndParent) != NULL ) hWndParent = ::GetParent(hWndParent);
		::ShowWindow(m_hWnd, SW_SHOW);
		::SendMessage(hWndParent, WM_NCACTIVATE, TRUE, 0L);
	}

	LPCTSTR CComboDownWnd::GetWindowClassName() const
	{
		return _T("ComboWnd");
	}

	void CComboDownWnd::OnFinalMessage(HWND hWnd)
	{
		m_pOwner->m_pWindow = NULL;
		m_pOwner->m_uButtonState &= ~ UISTATE_PUSHED;
		m_pOwner->Invalidate();
		delete this;
	}
	//bool   xxxxx=false;
	LRESULT CComboDownWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
	{
		if( uMsg == WM_CREATE )
		{
			m_pm.Init(m_hWnd);
			// The trick is to add the items to the new container. Their owner gets
			// reassigned by this operation - which is why it is important to reassign
			// the items back to the righfull owner/manager when the window closes.
			m_pLayout = new CVerticalLayoutUI;
			m_pm.UseParentResource(m_pOwner->GetManager());
			m_pLayout->SetManager(&m_pm, NULL, true);
			LPCTSTR pDefaultAttributes = m_pOwner->GetManager()->GetDefaultAttributeList(_T("VerticalLayout"));
			if( pDefaultAttributes )
			{
				m_pLayout->ApplyAttributeList(pDefaultAttributes);
			}
			m_pLayout->SetInset(CDuiRect(1, 1, 1, 1));
			m_pLayout->SetBkColor(0xFFFFFFFF);
			m_pLayout->SetBorderColor(0xFFC6C7D2);
			m_pLayout->SetBorderSize(1);
			m_pLayout->SetAutoDestroy(false);
			m_pLayout->EnableScrollBar();
			m_pLayout->ApplyAttributeList(m_pOwner->GetDropBoxAttributeList());
			for( int i = 0; i < m_pOwner->GetCount(); i++ )
			{
				m_pLayout->Add(static_cast<CControlUI*>(m_pOwner->GetItemAt(i)));
			}
			m_pm.AttachDialog(m_pLayout);
			m_pm.AddNotifier(this);  
			return 0;
		}
		else if( uMsg == WM_CLOSE ) 
		{
			m_pOwner->SetManager(m_pOwner->GetManager(), m_pOwner->GetParent(), false);
			m_pOwner->SetPos(m_pOwner->GetPos());
			m_pOwner->SetFocus();
		}
		else if( uMsg == WM_LBUTTONUP )
		{
			POINT pt = { 0 };
			::GetCursorPos(&pt);
			::ScreenToClient(m_pm.GetPaintWindow(), &pt);
			CControlUI* pControl = m_pm.FindControl(pt);
			//xxxxx=true;
			if( pControl && _tcscmp(pControl->GetClass(), _T("ScrollBarUI")) != 0 ) 
				PostMessage(WM_KILLFOCUS);
		}
		else if( uMsg == WM_KEYDOWN )
		{
				switch( wParam )
				{
					case VK_ESCAPE:
						m_pOwner->SelectItem(m_iOldSel, true);
						EnsureVisible(m_iOldSel);
						// FALL THROUGH...
					case VK_RETURN:
						PostMessage(WM_KILLFOCUS);
						break;
					default:
						TEventUI event;
						event.Type = UIEVENT_KEYDOWN;
						event.chKey = (TCHAR)wParam;
						m_pOwner->DoEvent(event);
						if(wParam!=17)
						EnsureVisible(m_pOwner->GetCurSel());
						return 0;
				}
		}
		else if( uMsg == WM_MOUSEWHEEL ) 
		{
			int zDelta = (int) (short) HIWORD(wParam);
			TEventUI event = { 0 };
			event.Type = UIEVENT_SCROLLWHEEL;
			event.wParam = MAKELPARAM(zDelta < 0 ? SB_LINEDOWN : SB_LINEUP, 0);
			event.lParam = lParam;
			event.dwTimestamp = ::GetTickCount();
			m_pOwner->DoEvent(event);
			EnsureVisible(m_pOwner->GetCurSel());
			return 0;
		}
		else if( uMsg == WM_KILLFOCUS ) 
		{
			::OutputDebugStringA(_T("XWM_KILLFOCUS\n"));
			if(m_pOwner->p_EditWnd!=NULL)
			{
			     if( m_hWnd != (HWND) wParam&&(HWND) wParam!=m_pOwner->p_EditWnd->GetHWND() )
				 {
					  m_pOwner->m_pWindow=NULL;
					  PostMessage(WM_CLOSE);
				 }
			}else
			{
			    if( m_hWnd != (HWND) wParam)
				{
					 m_pOwner->m_pWindow=NULL;
					  PostMessage(WM_CLOSE);
				}
			}
		}else if(uMsg ==WM_SETFOCUS)
		{
			return 0;
		}

		LRESULT lRes = 0;
		if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) 
			return lRes;
		return 
			CWindowWnd::HandleMessage(uMsg, wParam, lParam);
	}

	void CComboDownWnd::EnsureVisible(int iIndex)
	{
		if( m_pOwner->GetCurSel() < 0 ) 
			return;
		m_pLayout->FindSelectable(m_pOwner->GetCurSel(), false);
		RECT rcItem = m_pLayout->GetItemAt(iIndex)->GetPos(); //获取当前item的位置
		RECT rcList = m_pLayout->GetPos();                    //获取列表的位置
		CScrollBarUI* pHorizontalScrollBar = m_pLayout->GetHorizontalScrollBar();
		if( pHorizontalScrollBar && pHorizontalScrollBar->IsVisible() ) 
			rcList.bottom -= pHorizontalScrollBar->GetFixedHeight();
		int iPos = m_pLayout->GetScrollPos().cy;
		if( rcItem.top >= rcList.top && rcItem.bottom < rcList.bottom ) 
			return;
		int dx = 0;
		if( rcItem.top < rcList.top ) 
			dx = rcItem.top - rcList.top;
		if( rcItem.bottom > rcList.bottom ) 
			dx = rcItem.bottom - rcList.bottom;
		if(dx==1)
		{
			int i=0;
			i++;
		}
		Scroll(0, dx);
	}

	void CComboDownWnd::Scroll(int dx, int dy)
	{
		if( dx == 0 && dy == 0 ) 
			return;
		SIZE sz = m_pLayout->GetScrollPos();
		m_pLayout->SetScrollPos(CSize(sz.cx + dx, sz.cy + dy));
		char pp[100]={0};
		memset(pp,0,sizeof(char)*100);
		sprintf(pp,"y:%d,%d",sz.cy + dy,dy);
		//::OutputDebugString(pp);
		//::OutputDebugString("CLose\n");
	}

	#if(_WIN32_WINNT >= 0x0501)
	UINT CComboDownWnd::GetClassStyle() const
	{
		return __super::GetClassStyle() | CS_DROPSHADOW;
	}
	#endif



/******************Combox*************************/
CComboBoxExUI::CComboBoxExUI(): m_pWindow(NULL), m_iCurSel(-1), m_uButtonState(0)
{
		p_EditWnd=NULL;
		m_szDropBox = CSize(0, 150);
		::ZeroMemory(&m_rcTextPadding, sizeof(m_rcTextPadding));

		m_ListInfo.nColumns = 0;
		m_ListInfo.nFont = -1;
		m_ListInfo.uTextStyle = DT_VCENTER;
		m_ListInfo.dwTextColor = 0xFF000000;
		m_ListInfo.dwBkColor = 0;
		m_ListInfo.bAlternateBk = false;
		m_ListInfo.dwSelectedTextColor = 0xFF000000;
		m_ListInfo.dwSelectedBkColor = 0xFFC1E3FF;
		m_ListInfo.dwHotTextColor = 0xFF000000;
		m_ListInfo.dwHotBkColor = 0xFFE9F5FF;
		m_ListInfo.dwDisabledTextColor = 0xFFCCCCCC;
		m_ListInfo.dwDisabledBkColor = 0xFFFFFFFF;
		m_ListInfo.dwLineColor = 0;
		m_ListInfo.bShowHtml = false;
		m_ListInfo.bMultiExpandable = false;
		::ZeroMemory(&m_ListInfo.rcTextPadding, sizeof(m_ListInfo.rcTextPadding));
		::ZeroMemory(&m_ListInfo.rcColumn, sizeof(m_ListInfo.rcColumn));
}

LPCTSTR CComboBoxExUI::GetClass() const
{
    return _T("ComboBoxExUI");
}

LPVOID CComboBoxExUI::GetInterface(LPCTSTR pstrName)
{
	if( _tcscmp(pstrName, DUI_CTR_COMBO) == 0 ) 
		 return static_cast<CComboBoxExUI*>(this);
    if( _tcscmp(pstrName, _T("IListOwner")) == 0 ) 
		return static_cast<IListOwnerUI*>(this);
    return CContainerUI::GetInterface(pstrName);
}

UINT CComboBoxExUI::GetControlFlags() const
{
    return UIFLAG_TABSTOP;
}

void CComboBoxExUI::DoInit()
{
}

int CComboBoxExUI::GetCurSel() const
{
    return m_iCurSel;
}

bool CComboBoxExUI::SelectItem(int iIndex, bool bTakeFocus)
{
   /* if( m_pWindow != NULL ) 
		m_pWindow->Close();*/
	if(!IsEnabled())
		return false;
    if( iIndex == m_iCurSel ) 
		return true;
    int iOldSel = m_iCurSel;
    if( m_iCurSel >= 0 ) {
        CControlUI* pControl = static_cast<CControlUI*>(m_items[m_iCurSel]);
        if( !pControl ) 
			return false;
        IListItemUI* pListItem = static_cast<IListItemUI*>(pControl->GetInterface(_T("ListItem")));
        if( pListItem != NULL ) 
			pListItem->Select(false);
		SignalItemChange(iIndex,this);
        m_iCurSel = -1;
    }
    if( iIndex < 0 ) 
		return false;
    if( m_items.GetSize() == 0 ) 
		return false;
    if( iIndex >= m_items.GetSize() ) iIndex = m_items.GetSize() - 1;
    CControlUI* pControl = static_cast<CControlUI*>(m_items[iIndex]);
    /*if( !pControl || !pControl->IsVisible() || !pControl->IsEnabled() ) 
		return false;*/
    IListItemUI* pListItem = static_cast<IListItemUI*>(pControl->GetInterface(_T("ListItem")));
    if( pListItem == NULL ) 
		return false;
    m_iCurSel = iIndex;
    if( m_pWindow != NULL || bTakeFocus ) 
	{
		//pControl->SetFocus();
	}
    pListItem->Select(true);
    if( m_pManager != NULL ) 
		m_pManager->SendNotify(this, DUI_MSGTYPE_ITEMSELECT, m_iCurSel, iOldSel);
    Invalidate();
	
    return true;
}

bool CComboBoxExUI::SetItemIndex(CControlUI* pControl, int iIndex)
{
	if(!IsEnabled())
		return false;
    int iOrginIndex = GetItemIndex(pControl);
    if( iOrginIndex == -1 ) return false;
    if( iOrginIndex == iIndex ) return true;

    IListItemUI* pSelectedListItem = NULL;
    if( m_iCurSel >= 0 ) pSelectedListItem = 
        static_cast<IListItemUI*>(GetItemAt(m_iCurSel)->GetInterface(_T("ListItem")));
    if( !CContainerUI::SetItemIndex(pControl, iIndex) ) return false;
    int iMinIndex = min(iOrginIndex, iIndex);
    int iMaxIndex = max(iOrginIndex, iIndex);
    for(int i = iMinIndex; i < iMaxIndex + 1; ++i) {
        CControlUI* p = GetItemAt(i);
        IListItemUI* pListItem = static_cast<IListItemUI*>(p->GetInterface(_T("ListItem")));
        if( pListItem != NULL ) {
            pListItem->SetIndex(i);
        }
    }
    if( m_iCurSel >= 0 && pSelectedListItem != NULL ) m_iCurSel = pSelectedListItem->GetIndex();
    return true;
}

bool CComboBoxExUI::Add(CControlUI* pControl)
{
    IListItemUI* pListItem = static_cast<IListItemUI*>(pControl->GetInterface(_T("ListItem")));
    if( pListItem != NULL ) 
    {
        pListItem->SetOwner(this);
        pListItem->SetIndex(m_items.GetSize());
    }
    return CContainerUI::Add(pControl);
}

bool CComboBoxExUI::AddAt(CControlUI* pControl, int iIndex)
{
    if (!CContainerUI::AddAt(pControl, iIndex)) return false;

    // The list items should know about us
    IListItemUI* pListItem = static_cast<IListItemUI*>(pControl->GetInterface(_T("ListItem")));
    if( pListItem != NULL ) {
        pListItem->SetOwner(this);
        pListItem->SetIndex(iIndex);
    }

    for(int i = iIndex + 1; i < GetCount(); ++i) {
        CControlUI* p = GetItemAt(i);
        pListItem = static_cast<IListItemUI*>(p->GetInterface(_T("ListItem")));
        if( pListItem != NULL ) {
            pListItem->SetIndex(i);
        }
    }
    if( m_iCurSel >= iIndex ) m_iCurSel += 1;
    return true;
}

bool CComboBoxExUI::Remove(CControlUI* pControl)
{
    int iIndex = GetItemIndex(pControl);
    if (iIndex == -1) return false;

    if (!CContainerUI::RemoveAt(iIndex)) return false;

    for(int i = iIndex; i < GetCount(); ++i) {
        CControlUI* p = GetItemAt(i);
        IListItemUI* pListItem = static_cast<IListItemUI*>(p->GetInterface(_T("ListItem")));
        if( pListItem != NULL ) {
            pListItem->SetIndex(i);
        }
    }

    if( iIndex == m_iCurSel && m_iCurSel >= 0 ) {
        int iSel = m_iCurSel;
        m_iCurSel = -1;
        SelectItem(FindSelectable(iSel, false));
    }
    else if( iIndex < m_iCurSel ) m_iCurSel -= 1;
    return true;
}

bool CComboBoxExUI::RemoveAt(int iIndex)
{
    if (!CContainerUI::RemoveAt(iIndex)) return false;

    for(int i = iIndex; i < GetCount(); ++i) {
        CControlUI* p = GetItemAt(i);
        IListItemUI* pListItem = static_cast<IListItemUI*>(p->GetInterface(_T("ListItem")));
        if( pListItem != NULL ) pListItem->SetIndex(i);
    }

    if( iIndex == m_iCurSel && m_iCurSel >= 0 ) {
        int iSel = m_iCurSel;
        m_iCurSel = -1;
        SelectItem(FindSelectable(iSel, false));
    }
    else if( iIndex < m_iCurSel ) m_iCurSel -= 1;
    return true;
}

void CComboBoxExUI::RemoveAll()
{
    m_iCurSel = -1;
    CContainerUI::RemoveAll();
}

void CComboBoxExUI::DoEvent(TEventUI& ev)
	{
		if( !IsMouseEnabled() && ev.Type > UIEVENT__MOUSEBEGIN && ev.Type < UIEVENT__MOUSEEND ) {
			if( m_pParent != NULL ) 
				m_pParent->DoEvent(ev);
			else 
				CContainerUI::DoEvent(ev);
			return;
		}

		if( ev.Type == UIEVENT_SETFOCUS ) 
		{
			Invalidate();
		}
		if( ev.Type == UIEVENT_KILLFOCUS ) 
		{
			Invalidate();
		}
		if( ev.Type == UIEVENT_BUTTONDOWN )
		{
			
			if( IsEnabled() ) 
			{
				POINT pt;
				pt.x = GET_X_LPARAM(ev.lParam); 
				pt.y = GET_Y_LPARAM(ev.lParam); 
				RECT rt=this->GetPos();
				rt.right-=20;
				if(::PtInRect(&rt,pt))
				{
				    if( p_EditWnd ) 
					{
						int nSize = GetWindowTextLength(*p_EditWnd);
						if( nSize == 0 )
							nSize = 1;

						Edit_SetSel(*p_EditWnd, 0, nSize);
						return;
					}
					Activate();
					m_uButtonState |= UISTATE_PUSHED | UISTATE_CAPTURED;
					p_EditWnd = new CComboEditWnd();
					ASSERT(p_EditWnd);
					p_EditWnd->Init(this);
					Invalidate();
					{
					    int nSize = GetWindowTextLength(*p_EditWnd);
						if( nSize == 0 )
							nSize = 1;

						Edit_SetSel(*p_EditWnd, 0, nSize);
					}
					return;
				}
				rt.right+=20;
				rt.left=rt.right- 20;
				if(::PtInRect(&rt,pt))
				{
					Activate();
					m_uButtonState |= UISTATE_PUSHED | UISTATE_CAPTURED;
				}
			}
			return;
		}
		if( ev.Type == UIEVENT_BUTTONUP )
		{
			if( (m_uButtonState & UISTATE_CAPTURED) != 0 ) {
				m_uButtonState &= ~ UISTATE_CAPTURED;
				Invalidate();
			}
			return;
		}
		if( ev.Type == UIEVENT_MOUSEMOVE )
		{
			return;
		}
		if( ev.Type == UIEVENT_KEYDOWN )
		{
			switch( ev.chKey ) {
			case VK_F4:
				Activate();
				return;
			case VK_UP:
				SelectItem(FindSelectable(m_iCurSel - 1, false));
				return;
			case VK_DOWN:
				SelectItem(FindSelectable(m_iCurSel + 1, true));
				return;
			case VK_PRIOR:
				SelectItem(FindSelectable(m_iCurSel - 1, false));
				return;
			case VK_NEXT:
				SelectItem(FindSelectable(m_iCurSel + 1, true));
				return;
			case VK_HOME:
				SelectItem(FindSelectable(0, false));
				return;
			case VK_END:
				SelectItem(FindSelectable(GetCount() - 1, true));
				return;
			}
		}
		if( ev.Type == UIEVENT_SCROLLWHEEL )
		{
			bool bDownward = LOWORD(ev.wParam) == SB_LINEDOWN;
			SelectItem(FindSelectable(m_iCurSel + (bDownward ? 1 : -1), bDownward));
			return;
		}
		if( ev.Type == UIEVENT_CONTEXTMENU )
		{
			return;
		}
		if( ev.Type == UIEVENT_MOUSEENTER )
		{
			if( ::PtInRect(&m_rcItem, ev.ptMouse ) ) {
				if( (m_uButtonState & UISTATE_HOT) == 0  )
					m_uButtonState |= UISTATE_HOT;
				Invalidate();
			}
			return;
		}
		if( ev.Type == UIEVENT_MOUSELEAVE )
		{
			if( (m_uButtonState & UISTATE_HOT) != 0 ) {
				m_uButtonState &= ~UISTATE_HOT;
				Invalidate();
			}
			return;
		}
		CControlUI::DoEvent(ev);
	}

SIZE CComboBoxExUI::EstimateSize(SIZE szAvailable)
{
    if( m_cxyFixed.cy == 0 ) return CSize(m_cxyFixed.cx, m_pManager->GetDefaultFontInfo()->tm.tmHeight + 12);
    return CControlUI::EstimateSize(szAvailable);
}

bool CComboBoxExUI::Activate()
{
    if( !CControlUI::Activate() ) 
		return false;
    if( m_pWindow ) 
		return true;
    m_pWindow = new CComboDownWnd();
    ASSERT(m_pWindow);
    m_pWindow->Init(this);
    if( m_pManager != NULL) 
		m_pManager->SendNotify(this, DUI_MSGTYPE_DROPDOWN);
    Invalidate();
    return true;
}

CDuiString CComboBoxExUI::GetText() const
{
    if( m_iCurSel < 0 ) return _T("");
    CControlUI* pControl = static_cast<CControlUI*>(m_items[m_iCurSel]);
    return pControl->GetText();
}

void CComboBoxExUI::SetEnabled(bool bEnable)
{
    CContainerUI::SetEnabled(bEnable);
    if( !IsEnabled() ) m_uButtonState = 0;
	if( m_iCurSel >= 0 ) {
		CControlUI* pControl = static_cast<CControlUI*>(m_items[m_iCurSel]);
		if( pControl != NULL ) {
			pControl->SetEnabled(bEnable);
		}
	}
}

CDuiString CComboBoxExUI::GetDropBoxAttributeList()
{
    return m_sDropBoxAttributes;
}

void CComboBoxExUI::SetDropBoxAttributeList(LPCTSTR pstrList)
{
    m_sDropBoxAttributes = pstrList;
}

SIZE CComboBoxExUI::GetDropBoxSize() const
{
    return m_szDropBox;
}

void CComboBoxExUI::SetDropBoxSize(SIZE szDropBox)
{
    m_szDropBox = szDropBox;
}

RECT CComboBoxExUI::GetTextPadding() const
{
    return m_rcTextPadding;
}

void CComboBoxExUI::SetTextPadding(RECT rc)
{
    m_rcTextPadding = rc;
    Invalidate();
}

LPCTSTR CComboBoxExUI::GetNormalImage() const
{
    return m_sNormalImage;
}

void CComboBoxExUI::SetNormalImage(LPCTSTR pStrImage)
{
    m_sNormalImage = pStrImage;
    Invalidate();
}

LPCTSTR CComboBoxExUI::GetHotImage() const
{
    return m_sHotImage;
}

void CComboBoxExUI::SetHotImage(LPCTSTR pStrImage)
{
    m_sHotImage = pStrImage;
    Invalidate();
}

LPCTSTR CComboBoxExUI::GetPushedImage() const
{
    return m_sPushedImage;
}

void CComboBoxExUI::SetPushedImage(LPCTSTR pStrImage)
{
    m_sPushedImage = pStrImage;
    Invalidate();
}

LPCTSTR CComboBoxExUI::GetFocusedImage() const
{
    return m_sFocusedImage;
}

void CComboBoxExUI::SetFocusedImage(LPCTSTR pStrImage)
{
    m_sFocusedImage = pStrImage;
    Invalidate();
}

LPCTSTR CComboBoxExUI::GetDisabledImage() const
{
    return m_sDisabledImage;
}

void CComboBoxExUI::SetDisabledImage(LPCTSTR pStrImage)
{
    m_sDisabledImage = pStrImage;
    Invalidate();
}

TListInfoUI* CComboBoxExUI::GetListInfo()
{
    return &m_ListInfo;
}

void CComboBoxExUI::SetItemFont(int index)
{
    m_ListInfo.nFont = index;
    Invalidate();
}

void CComboBoxExUI::SetItemTextStyle(UINT uStyle)
{
	m_ListInfo.uTextStyle = uStyle;
	Invalidate();
}

RECT CComboBoxExUI::GetItemTextPadding() const
{
	return m_ListInfo.rcTextPadding;
}

void CComboBoxExUI::SetItemTextPadding(RECT rc)
{
    m_ListInfo.rcTextPadding = rc;
    Invalidate();
}

void CComboBoxExUI::SetItemTextColor(DWORD dwTextColor)
{
    m_ListInfo.dwTextColor = dwTextColor;
    Invalidate();
}

void CComboBoxExUI::SetItemBkColor(DWORD dwBkColor)
{
    m_ListInfo.dwBkColor = dwBkColor;
}

void CComboBoxExUI::SetItemBkImage(LPCTSTR pStrImage)
{
    m_ListInfo.sBkImage = pStrImage;
}

DWORD CComboBoxExUI::GetItemTextColor() const
{
	return m_ListInfo.dwTextColor;
}

DWORD CComboBoxExUI::GetItemBkColor() const
{
	return m_ListInfo.dwBkColor;
}

LPCTSTR CComboBoxExUI::GetItemBkImage() const
{
	return m_ListInfo.sBkImage;
}

bool CComboBoxExUI::IsAlternateBk() const
{
    return m_ListInfo.bAlternateBk;
}

void CComboBoxExUI::SetAlternateBk(bool bAlternateBk)
{
    m_ListInfo.bAlternateBk = bAlternateBk;
}

void CComboBoxExUI::SetSelectedItemTextColor(DWORD dwTextColor)
{
    m_ListInfo.dwSelectedTextColor = dwTextColor;
}

void CComboBoxExUI::SetSelectedItemBkColor(DWORD dwBkColor)
{
    m_ListInfo.dwSelectedBkColor = dwBkColor;
}

void CComboBoxExUI::SetSelectedItemImage(LPCTSTR pStrImage)
{
	m_ListInfo.sSelectedImage = pStrImage;
}

DWORD CComboBoxExUI::GetSelectedItemTextColor() const
{
	return m_ListInfo.dwSelectedTextColor;
}

DWORD CComboBoxExUI::GetSelectedItemBkColor() const
{
	return m_ListInfo.dwSelectedBkColor;
}

LPCTSTR CComboBoxExUI::GetSelectedItemImage() const
{
	return m_ListInfo.sSelectedImage;
}

void CComboBoxExUI::SetHotItemTextColor(DWORD dwTextColor)
{
    m_ListInfo.dwHotTextColor = dwTextColor;
}

void CComboBoxExUI::SetHotItemBkColor(DWORD dwBkColor)
{
    m_ListInfo.dwHotBkColor = dwBkColor;
}

void CComboBoxExUI::SetHotItemImage(LPCTSTR pStrImage)
{
    m_ListInfo.sHotImage = pStrImage;
}

DWORD CComboBoxExUI::GetHotItemTextColor() const
{
	return m_ListInfo.dwHotTextColor;
}
DWORD CComboBoxExUI::GetHotItemBkColor() const
{
	return m_ListInfo.dwHotBkColor;
}

LPCTSTR CComboBoxExUI::GetHotItemImage() const
{
	return m_ListInfo.sHotImage;
}

void CComboBoxExUI::SetDisabledItemTextColor(DWORD dwTextColor)
{
    m_ListInfo.dwDisabledTextColor = dwTextColor;
}

void CComboBoxExUI::SetDisabledItemBkColor(DWORD dwBkColor)
{
    m_ListInfo.dwDisabledBkColor = dwBkColor;
}

void CComboBoxExUI::SetDisabledItemImage(LPCTSTR pStrImage)
{
    m_ListInfo.sDisabledImage = pStrImage;
}

DWORD CComboBoxExUI::GetDisabledItemTextColor() const
{
	return m_ListInfo.dwDisabledTextColor;
}

DWORD CComboBoxExUI::GetDisabledItemBkColor() const
{
	return m_ListInfo.dwDisabledBkColor;
}

LPCTSTR CComboBoxExUI::GetDisabledItemImage() const
{
	return m_ListInfo.sDisabledImage;
}

DWORD CComboBoxExUI::GetItemLineColor() const
{
	return m_ListInfo.dwLineColor;
}

void CComboBoxExUI::SetItemLineColor(DWORD dwLineColor)
{
    m_ListInfo.dwLineColor = dwLineColor;
}

bool CComboBoxExUI::IsItemShowHtml()
{
    return m_ListInfo.bShowHtml;
}

void CComboBoxExUI::SetItemShowHtml(bool bShowHtml)
{
    if( m_ListInfo.bShowHtml == bShowHtml ) return;

    m_ListInfo.bShowHtml = bShowHtml;
    Invalidate();
}

void CComboBoxExUI::SetPos(RECT rc)
{
    // Put all elements out of sight
    RECT rcNull = { 0 };
    for( int i = 0; i < m_items.GetSize(); i++ ) static_cast<CControlUI*>(m_items[i])->SetPos(rcNull);
    // Position this control
    CControlUI::SetPos(rc);
}
void CComboDownWnd::Notify(TNotifyUI& msg)  
{  
    if(msg.sType == _T("windowinit"))  
    {  
        EnsureVisible(m_iOldSel);  
    }  
}
void CComboBoxExUI::SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue)
{
    if( _tcscmp(pstrName, _T("textpadding")) == 0 ) {
        RECT rcTextPadding = { 0 };
        LPTSTR pstr = NULL;
        rcTextPadding.left = _tcstol(pstrValue, &pstr, 10);  ASSERT(pstr);    
        rcTextPadding.top = _tcstol(pstr + 1, &pstr, 10);    ASSERT(pstr);    
        rcTextPadding.right = _tcstol(pstr + 1, &pstr, 10);  ASSERT(pstr);    
        rcTextPadding.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);    
        SetTextPadding(rcTextPadding);
    }
    else if( _tcscmp(pstrName, _T("normalimage")) == 0 ) SetNormalImage(pstrValue);
    else if( _tcscmp(pstrName, _T("hotimage")) == 0 ) SetHotImage(pstrValue);
    else if( _tcscmp(pstrName, _T("pushedimage")) == 0 ) SetPushedImage(pstrValue);
    else if( _tcscmp(pstrName, _T("focusedimage")) == 0 ) SetFocusedImage(pstrValue);
    else if( _tcscmp(pstrName, _T("disabledimage")) == 0 ) SetDisabledImage(pstrValue);
    else if( _tcscmp(pstrName, _T("dropbox")) == 0 ) SetDropBoxAttributeList(pstrValue);
	else if( _tcscmp(pstrName, _T("dropboxsize")) == 0)
	{
		SIZE szDropBoxSize = { 0 };
		LPTSTR pstr = NULL;
		szDropBoxSize.cx = _tcstol(pstrValue, &pstr, 10);  ASSERT(pstr);    
		szDropBoxSize.cy = _tcstol(pstr + 1, &pstr, 10);    ASSERT(pstr);    
		SetDropBoxSize(szDropBoxSize);
	}
    else if( _tcscmp(pstrName, _T("itemfont")) == 0 ) m_ListInfo.nFont = _ttoi(pstrValue);
    else if( _tcscmp(pstrName, _T("itemalign")) == 0 ) {
        if( _tcsstr(pstrValue, _T("left")) != NULL ) {
            m_ListInfo.uTextStyle &= ~(DT_CENTER | DT_RIGHT);
            m_ListInfo.uTextStyle |= DT_LEFT;
        }
        if( _tcsstr(pstrValue, _T("center")) != NULL ) {
            m_ListInfo.uTextStyle &= ~(DT_LEFT | DT_RIGHT);
            m_ListInfo.uTextStyle |= DT_CENTER;
        }
        if( _tcsstr(pstrValue, _T("right")) != NULL ) {
            m_ListInfo.uTextStyle &= ~(DT_LEFT | DT_CENTER);
            m_ListInfo.uTextStyle |= DT_RIGHT;
        }
    }
    if( _tcscmp(pstrName, _T("itemtextpadding")) == 0 ) {
        RECT rcTextPadding = { 0 };
        LPTSTR pstr = NULL;
        rcTextPadding.left = _tcstol(pstrValue, &pstr, 10);  ASSERT(pstr);    
        rcTextPadding.top = _tcstol(pstr + 1, &pstr, 10);    ASSERT(pstr);    
        rcTextPadding.right = _tcstol(pstr + 1, &pstr, 10);  ASSERT(pstr);    
        rcTextPadding.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);    
        SetItemTextPadding(rcTextPadding);
    }
    else if( _tcscmp(pstrName, _T("itemtextcolor")) == 0 ) {
        if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
        LPTSTR pstr = NULL;
        DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
        SetItemTextColor(clrColor);
    }
    else if( _tcscmp(pstrName, _T("itembkcolor")) == 0 ) {
        if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
        LPTSTR pstr = NULL;
        DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
        SetItemBkColor(clrColor);
    }
    else if( _tcscmp(pstrName, _T("itembkimage")) == 0 ) SetItemBkImage(pstrValue);
    else if( _tcscmp(pstrName, _T("itemaltbk")) == 0 ) SetAlternateBk(_tcscmp(pstrValue, _T("true")) == 0);
    else if( _tcscmp(pstrName, _T("itemselectedtextcolor")) == 0 ) {
        if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
        LPTSTR pstr = NULL;
        DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
        SetSelectedItemTextColor(clrColor);
    }
    else if( _tcscmp(pstrName, _T("itemselectedbkcolor")) == 0 ) {
        if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
        LPTSTR pstr = NULL;
        DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
        SetSelectedItemBkColor(clrColor);
    }
    else if( _tcscmp(pstrName, _T("itemselectedimage")) == 0 ) SetSelectedItemImage(pstrValue);
    else if( _tcscmp(pstrName, _T("itemhottextcolor")) == 0 ) {
        if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
        LPTSTR pstr = NULL;
        DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
        SetHotItemTextColor(clrColor);
    }
    else if( _tcscmp(pstrName, _T("itemhotbkcolor")) == 0 ) {
        if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
        LPTSTR pstr = NULL;
        DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
        SetHotItemBkColor(clrColor);
    }
    else if( _tcscmp(pstrName, _T("itemhotimage")) == 0 ) SetHotItemImage(pstrValue);
    else if( _tcscmp(pstrName, _T("itemdisabledtextcolor")) == 0 ) {
        if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
        LPTSTR pstr = NULL;
        DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
        SetDisabledItemTextColor(clrColor);
    }
    else if( _tcscmp(pstrName, _T("itemdisabledbkcolor")) == 0 ) {
        if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
        LPTSTR pstr = NULL;
        DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
        SetDisabledItemBkColor(clrColor);
    }
    else if( _tcscmp(pstrName, _T("itemdisabledimage")) == 0 ) SetDisabledItemImage(pstrValue);
    else if( _tcscmp(pstrName, _T("itemlinecolor")) == 0 ) {
        if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
        LPTSTR pstr = NULL;
        DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
        SetItemLineColor(clrColor);
    }
    else if( _tcscmp(pstrName, _T("itemshowhtml")) == 0 ) SetItemShowHtml(_tcscmp(pstrValue, _T("true")) == 0);
    else CContainerUI::SetAttribute(pstrName, pstrValue);
}

void CComboBoxExUI::DoPaint(HDC hDC, const RECT& rcPaint)
{
    CControlUI::DoPaint(hDC, rcPaint);
}

void CComboBoxExUI::PaintStatusImage(HDC hDC)
{
    if( IsFocused() ) m_uButtonState |= UISTATE_FOCUSED;
    else m_uButtonState &= ~ UISTATE_FOCUSED;
    if( !IsEnabled() ) m_uButtonState |= UISTATE_DISABLED;
    else m_uButtonState &= ~ UISTATE_DISABLED;

    if( (m_uButtonState & UISTATE_DISABLED) != 0 ) {
        if( !m_sDisabledImage.IsEmpty() ) {
            if( !DrawImage(hDC, (LPCTSTR)m_sDisabledImage) ) m_sDisabledImage.Empty();
            else return;
        }
    }
    else if( (m_uButtonState & UISTATE_PUSHED) != 0 ) {
        if( !m_sPushedImage.IsEmpty() ) {
            if( !DrawImage(hDC, (LPCTSTR)m_sPushedImage) ) m_sPushedImage.Empty();
            else return;
        }
    }
    else if( (m_uButtonState & UISTATE_HOT) != 0 ) {
        if( !m_sHotImage.IsEmpty() ) {
            if( !DrawImage(hDC, (LPCTSTR)m_sHotImage) ) m_sHotImage.Empty();
            else return;
        }
    }
    else if( (m_uButtonState & UISTATE_FOCUSED) != 0 ) {
        if( !m_sFocusedImage.IsEmpty() ) {
            if( !DrawImage(hDC, (LPCTSTR)m_sFocusedImage) ) m_sFocusedImage.Empty();
            else return;
        }
    }

    if( !m_sNormalImage.IsEmpty() ) {
        if( !DrawImage(hDC, (LPCTSTR)m_sNormalImage) ) m_sNormalImage.Empty();
        else return;
    }
}

void CComboBoxExUI::PaintText(HDC hDC)
{
    RECT rcText = m_rcItem;
    rcText.left += m_rcTextPadding.left;
    rcText.right -= m_rcTextPadding.right;
    rcText.top += m_rcTextPadding.top;
    rcText.bottom -= m_rcTextPadding.bottom;

    if( m_iCurSel >= 0 ) {
        CControlUI* pControl = static_cast<CControlUI*>(m_items[m_iCurSel]);
        IListItemUI* pElement = static_cast<IListItemUI*>(pControl->GetInterface(_T("ListItem")));
        if( pElement != NULL ) {
            pElement->DrawItemText(hDC, rcText);
        }
        else {
            RECT rcOldPos = pControl->GetPos();
            pControl->SetPos(rcText);
            pControl->DoPaint(hDC, rcText);
            pControl->SetPos(rcOldPos);
        }
    }
}

	
}


你可能感兴趣的:(combobox,duilib)