| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908 |
- // SkinToolBar.cpp : 实现文件
- //
- #include "stdafx.h"
- #include "SkinUI.h"
- #include "SkinToolBar.h"
- CSkinToolBarItem::CSkinToolBarItem( void )
- {
- m_nID = 0;
- m_dwStyle = STBI_STYLE_BUTTON;
- m_nWidth = m_nHeight = 0;
- m_nLeftWidth = m_nRightWidth = 0;
- m_nPadding = 0;
- m_strText = _T("");
- m_strToolTipText = _T("");
- m_lpBgImgN = m_lpBgImgH = m_lpBgImgD = NULL;
- m_lpLeftH = m_lpLeftD = NULL;
- m_lpRightH = m_lpRightD = NULL;
- m_lpSepartorImg = NULL;
- m_lpArrowImg = NULL;
- m_lpIconImg = NULL;
- m_bChecked = FALSE;
- }
- CSkinToolBarItem::~CSkinToolBarItem( void )
- {
- RenderEngine->RemoveImage(m_lpBgImgN);
- RenderEngine->RemoveImage(m_lpBgImgH);
- RenderEngine->RemoveImage(m_lpBgImgD);
- RenderEngine->RemoveImage(m_lpLeftH);
- RenderEngine->RemoveImage(m_lpLeftD);
- RenderEngine->RemoveImage(m_lpRightH);
- RenderEngine->RemoveImage(m_lpRightD);
- RenderEngine->RemoveImage(m_lpSepartorImg);
- RenderEngine->RemoveImage(m_lpArrowImg);
- RenderEngine->RemoveImage(m_lpIconImg);
- }
- //////////////////////////////////////////////////////////////////////////
- // CSkinToolBar
- IMPLEMENT_DYNAMIC(CSkinToolBar, CWnd)
- CSkinToolBar::CSkinToolBar()
- {
- m_lpBgImg = NULL;
- m_nPressIndex = m_nHoverIndex = -1;
- m_bPressLorR = m_bHoverLorR = FALSE;
- m_bMouseTracking = FALSE;
- m_nLeft = m_nTop = 0;
- m_bAutoSize = FALSE;
- }
- CSkinToolBar::~CSkinToolBar()
- {
- }
- BEGIN_MESSAGE_MAP(CSkinToolBar, CWnd)
- ON_WM_ERASEBKGND()
- ON_WM_PAINT()
- ON_WM_LBUTTONDOWN()
- ON_WM_LBUTTONUP()
- ON_WM_MOUSEMOVE()
- ON_WM_DESTROY()
- ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
- END_MESSAGE_MAP()
- // CSkinToolBar 消息处理程序
- void CSkinToolBar::SetLeftTop(int nLeft, int nTop)
- {
- m_nLeft = nLeft;
- m_nTop = nTop;
- }
- void CSkinToolBar::SetAutoSize(BOOL bAutoSize)
- {
- m_bAutoSize = bAutoSize;
- }
- BOOL CSkinToolBar::SetBgPic(LPCTSTR lpszFileName, CONST LPRECT lprcNinePart)
- {
- RenderEngine->RemoveImage(m_lpBgImg);
- m_lpBgImg = RenderEngine->GetImage(lpszFileName);
- if (NULL == m_lpBgImg)
- return FALSE;
- m_lpBgImg->SetNinePart(lprcNinePart);
- return TRUE;
- }
- int CSkinToolBar::AddItem(int nID, DWORD dwStyle)
- {
- CSkinToolBarItem * lpItem = new CSkinToolBarItem;
- if (NULL == lpItem)
- return -1;
- lpItem->m_nID = nID;
- lpItem->m_dwStyle = dwStyle;
- m_arrItems.push_back(lpItem);
- return m_arrItems.size() - 1;
- }
- void CSkinToolBar::SetItemStyle(int nIndex, int dwStyle)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- if (lpItem != NULL)
- lpItem->m_dwStyle = dwStyle;
- }
- void CSkinToolBar::SetItemID(int nIndex, int nID)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- if (lpItem != NULL)
- lpItem->m_nID = nID;
- }
- void CSkinToolBar::SetItemSize(int nIndex, int nWidth, int nHeight,
- int nLeftWidth/* = 0*/, int nRightWidth/* = 0*/)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- if (lpItem != NULL)
- {
- lpItem->m_nWidth = nWidth;
- lpItem->m_nHeight = nHeight;
- lpItem->m_nLeftWidth = nLeftWidth;
- lpItem->m_nRightWidth = nRightWidth;
- }
- }
- void CSkinToolBar::SetItemPadding(int nIndex, int nPadding)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- if (lpItem != NULL)
- lpItem->m_nPadding = nPadding;
- }
- void CSkinToolBar::SetItemText(int nIndex, LPCTSTR lpszText)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- if (lpItem != NULL)
- lpItem->m_strText = lpszText;
- }
- void CSkinToolBar::SetItemToolTipText(int nIndex, LPCTSTR lpszText)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- if (lpItem != NULL)
- lpItem->m_strToolTipText = lpszText;
- }
- BOOL CSkinToolBar::SetItemBgPic(int nIndex, LPCTSTR lpNormal,
- LPCTSTR lpHighlight, LPCTSTR lpDown, CONST LPRECT lprcNinePart)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- if (NULL == lpItem)
- return FALSE;
- RenderEngine->RemoveImage(lpItem->m_lpBgImgN);
- RenderEngine->RemoveImage(lpItem->m_lpBgImgH);
- RenderEngine->RemoveImage(lpItem->m_lpBgImgD);
- lpItem->m_lpBgImgN = RenderEngine->GetImage(lpNormal);
- lpItem->m_lpBgImgH = RenderEngine->GetImage(lpHighlight);
- lpItem->m_lpBgImgD = RenderEngine->GetImage(lpDown);
- if (lpItem->m_lpBgImgN != NULL)
- lpItem->m_lpBgImgN->SetNinePart(lprcNinePart);
- if (lpItem->m_lpBgImgH != NULL)
- lpItem->m_lpBgImgH->SetNinePart(lprcNinePart);
- if (lpItem->m_lpBgImgD != NULL)
- lpItem->m_lpBgImgD->SetNinePart(lprcNinePart);
- if ((lpNormal != NULL && NULL == lpItem->m_lpBgImgN) ||
- (lpHighlight != NULL && NULL == lpItem->m_lpBgImgH) ||
- (lpDown != NULL && NULL == lpItem->m_lpBgImgD))
- return FALSE;
- else
- return TRUE;
- }
- BOOL CSkinToolBar::SetItemLeftBgPic(int nIndex, LPCTSTR lpHighlight,
- LPCTSTR lpDown, CONST LPRECT lprcNinePart)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- if (NULL == lpItem)
- return FALSE;
- RenderEngine->RemoveImage(lpItem->m_lpLeftH);
- RenderEngine->RemoveImage(lpItem->m_lpLeftD);
- lpItem->m_lpLeftH = RenderEngine->GetImage(lpHighlight);
- lpItem->m_lpLeftD = RenderEngine->GetImage(lpDown);
- if (lpItem->m_lpLeftH != NULL)
- lpItem->m_lpLeftH->SetNinePart(lprcNinePart);
- if (lpItem->m_lpLeftD != NULL)
- lpItem->m_lpLeftD->SetNinePart(lprcNinePart);
- if ((lpHighlight != NULL && NULL == lpItem->m_lpLeftH) ||
- (lpDown != NULL && NULL == lpItem->m_lpLeftD))
- return FALSE;
- else
- return TRUE;
- }
- BOOL CSkinToolBar::SetItemRightBgPic(int nIndex, LPCTSTR lpHighlight,
- LPCTSTR lpDown, CONST LPRECT lprcNinePart)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- if (NULL == lpItem)
- return FALSE;
- RenderEngine->RemoveImage(lpItem->m_lpRightH);
- RenderEngine->RemoveImage(lpItem->m_lpRightD);
- lpItem->m_lpRightH = RenderEngine->GetImage(lpHighlight);
- lpItem->m_lpRightD = RenderEngine->GetImage(lpDown);
- if (lpItem->m_lpRightH != NULL)
- lpItem->m_lpRightH->SetNinePart(lprcNinePart);
- if (lpItem->m_lpRightD != NULL)
- lpItem->m_lpRightD->SetNinePart(lprcNinePart);
- if ((lpHighlight != NULL && NULL == lpItem->m_lpRightH) ||
- (lpDown != NULL && NULL == lpItem->m_lpRightD))
- return FALSE;
- else
- return TRUE;
- }
- BOOL CSkinToolBar::SetItemSepartorPic(int nIndex, LPCTSTR lpszFileName)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- if (NULL == lpItem)
- return FALSE;
- RenderEngine->RemoveImage(lpItem->m_lpSepartorImg);
- lpItem->m_lpSepartorImg = RenderEngine->GetImage(lpszFileName);
- if (NULL == lpItem->m_lpSepartorImg)
- return FALSE;
- else
- return TRUE;
- }
- BOOL CSkinToolBar::SetItemArrowPic(int nIndex, LPCTSTR lpszFileName)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- if (NULL == lpItem)
- return FALSE;
- RenderEngine->RemoveImage(lpItem->m_lpArrowImg);
- lpItem->m_lpArrowImg = RenderEngine->GetImage(lpszFileName);
- if (NULL == lpItem->m_lpArrowImg)
- return FALSE;
- else
- return TRUE;
- }
- BOOL CSkinToolBar::SetItemIconPic(int nIndex, LPCTSTR lpszFileName)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- if (NULL == lpItem)
- return FALSE;
- RenderEngine->RemoveImage(lpItem->m_lpIconImg);
- lpItem->m_lpIconImg = RenderEngine->GetImage(lpszFileName);
- if (NULL == lpItem->m_lpIconImg)
- return FALSE;
- else
- return TRUE;
- }
- BOOL CSkinToolBar::GetItemRectByIndex(int nIndex, CRect& rect)
- {
- CSkinToolBarItem * lpItem;
- int nLeft = m_nLeft, nTop = m_nTop;
- for (int i = 0; i < (int)m_arrItems.size(); i++)
- {
- lpItem = m_arrItems[i];
- if (lpItem != NULL)
- {
- if (i == nIndex)
- {
- rect = CRect(nLeft, nTop, nLeft+lpItem->m_nWidth, nTop+lpItem->m_nHeight);
- return TRUE;
- }
- nLeft += lpItem->m_nWidth;
- nLeft += lpItem->m_nPadding;
- }
- }
- return FALSE;
- }
- BOOL CSkinToolBar::GetItemRectByID(int nID, CRect& rect)
- {
- CSkinToolBarItem * lpItem;
- int nLeft = m_nLeft, nTop = m_nTop;
- for (int i = 0; i < (int)m_arrItems.size(); i++)
- {
- lpItem = m_arrItems[i];
- if (lpItem != NULL)
- {
- if (lpItem->m_nID == nID)
- {
- rect = CRect(nLeft, nTop, nLeft+lpItem->m_nWidth, nTop+lpItem->m_nHeight);
- return TRUE;
- }
- nLeft += lpItem->m_nWidth;
- nLeft += lpItem->m_nPadding;
- }
- }
- return FALSE;
- }
- BOOL CSkinToolBar::GetItemCheckState(int nIndex)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- return ((lpItem != NULL) ? lpItem->m_bChecked : FALSE);
- }
- void CSkinToolBar::SetItemCheckState(int nIndex, BOOL bChecked)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- if (lpItem != NULL && lpItem->m_bChecked != bChecked)
- {
- lpItem->m_bChecked = bChecked;
- }
- }
- BOOL CSkinToolBar::OnEraseBkgnd(CDC* pDC)
- {
- return TRUE;
- return __super::OnEraseBkgnd(pDC);
- }
- void CSkinToolBar::OnPaint()
- {
- CPaintDC dc(this); // device context for painting
-
- CRect rcClient;
- GetClientRect(&rcClient);
- CMemoryDC MemDC(&dc, rcClient);
- DrawParentWndBg(GetSafeHwnd(),MemDC.m_hDC);
- if ( CHECK_IMAGE(m_lpBgImg) )
- m_lpBgImg->Draw(&MemDC, rcClient);
- for (int i = 0; i < (int)m_arrItems.size(); i++)
- {
- DrawItem(&MemDC, i);
- }
- }
- void CSkinToolBar::OnLButtonDown(UINT nFlags, CPoint point)
- {
- SetFocus();
- m_nPressIndex = HitTest(point);
- if (m_nPressIndex != -1)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(m_nPressIndex);
- if (lpItem != NULL)
- {
- CRect rcItem;
- GetItemRectByIndex(m_nPressIndex, rcItem);
- CRect rcLeft, rcRight;
- if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN ||
- lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN)
- {
- rcLeft = rcItem;
- rcLeft.right = rcLeft.left + lpItem->m_nLeftWidth;
- rcRight = rcItem;
- rcRight.left += lpItem->m_nLeftWidth;
- rcRight.right = rcRight.left + lpItem->m_nRightWidth;
- if (rcLeft.PtInRect(point))
- m_bPressLorR = TRUE;
- if (rcRight.PtInRect(point))
- m_bPressLorR = FALSE;
- }
- if (lpItem->m_dwStyle & STBI_STYLE_CHECK && !((lpItem->m_dwStyle & STBI_STYLE_DROPDOWN) && !m_bPressLorR))
- {
- lpItem->m_bChecked = !lpItem->m_bChecked;
- Invalidate(FALSE);
- if (lpItem->m_bChecked)
- {
- ::SendMessage(::GetParent(m_hWnd), WM_COMMAND,
- MAKEWPARAM(lpItem->m_nID, BN_PUSHED), 0);
- }
- else
- {
- ::SendMessage(::GetParent(m_hWnd), WM_COMMAND,
- MAKEWPARAM(lpItem->m_nID, BN_UNPUSHED), 0);
- }
- }
- else
- {
- if ((lpItem->m_dwStyle & STBI_STYLE_DROPDOWN && !m_bPressLorR)
- || (lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN))
- {
- Invalidate(FALSE);
- NMTOOLBAR nmtb = {0};
- nmtb.hdr.hwndFrom = m_hWnd;
- nmtb.hdr.idFrom = GetDlgCtrlID();
- nmtb.hdr.code = TBN_DROPDOWN;
- nmtb.iItem = lpItem->m_nID;
- nmtb.rcButton = rcItem;
- ::SendMessage(::GetParent(m_hWnd), WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&nmtb);
- m_nPressIndex = -1;
- Invalidate(FALSE);
- }
- else
- {
- Invalidate(FALSE);
- ::SetCapture(m_hWnd);
- }
- }
- }
- }
- __super::OnLButtonDown(nFlags, point);
- }
- void CSkinToolBar::OnLButtonUp(UINT nFlags, CPoint point)
- {
- HWND hWnd = ::GetCapture();
- if (m_hWnd == hWnd)
- ::ReleaseCapture();
- int nIndex = HitTest(point);
- BOOL bClicked;
- if (nIndex != -1 && nIndex == m_nPressIndex)
- bClicked = TRUE;
- else
- bClicked = FALSE;
- if (m_nPressIndex != -1)
- {
- m_nPressIndex = -1;
- Invalidate(FALSE);
- }
- if (bClicked)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- if (lpItem != NULL)
- {
- CRect rcItem;
- GetItemRectByIndex(m_nPressIndex, rcItem);
- CRect rcLeft, rcRight;
- BOOL bClickLorR = FALSE;
- if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN ||
- lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN)
- {
- rcLeft = rcItem;
- rcLeft.right = rcLeft.left + lpItem->m_nLeftWidth;
- rcRight = rcItem;
- rcRight.left += lpItem->m_nLeftWidth;
- rcRight.right = rcRight.left + lpItem->m_nRightWidth;
- if (rcLeft.PtInRect(point))
- bClickLorR = TRUE;
- if (rcRight.PtInRect(point))
- bClickLorR = FALSE;
- }
- if ((!(lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN))
- || (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN && bClickLorR && bClickLorR == m_bPressLorR))
- ::SendMessage(::GetParent(m_hWnd), WM_COMMAND, MAKEWPARAM(lpItem->m_nID, BN_CLICKED), 0);
- }
- }
- __super::OnLButtonUp(nFlags, point);
- }
- void CSkinToolBar::OnMouseMove(UINT nFlags, CPoint point)
- {
- if (m_nPressIndex != -1)
- return;
- if (!m_bMouseTracking)
- {
- TrackMouseLeave(GetSafeHwnd());
- m_bMouseTracking = TRUE;
- }
- int nIndex;
- BOOL bHoverLorR = FALSE;
- nIndex = HitTest(point);
- if (nIndex != -1)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- if (lpItem != NULL)
- {
- CRect rcItem;
- GetItemRectByIndex(nIndex, rcItem);
- if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN ||
- lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN)
- {
- CRect rcLeft(rcItem);
- rcLeft.right = rcLeft.left + lpItem->m_nLeftWidth;
- CRect rcRight(rcItem);
- rcRight.left += lpItem->m_nLeftWidth;
- rcRight.right = rcRight.left + lpItem->m_nRightWidth;
- if (rcLeft.PtInRect(point))
- bHoverLorR = TRUE;
- if (rcRight.PtInRect(point))
- bHoverLorR = FALSE;
- }
- if (nIndex != m_nHoverIndex && lpItem->m_strToolTipText.GetLength() > 0)
- {
- if (!m_ToolTipCtrl.GetSafeHwnd())
- {
- m_ToolTipCtrl.Create(this);
- m_ToolTipCtrl.SetMaxTipWidth(200);
- }
- if (m_ToolTipCtrl.GetSafeHwnd())
- {
- if (m_ToolTipCtrl.GetToolCount() <= 0)
- {
- m_ToolTipCtrl.Activate(TRUE);
- m_ToolTipCtrl.AddTool(this, lpItem->m_strToolTipText.GetBuffer(), &rcItem, 1);
- }
- else
- {
- m_ToolTipCtrl.Activate(TRUE);
- m_ToolTipCtrl.UpdateTipText(lpItem->m_strToolTipText.GetBuffer(), this, 1);
- m_ToolTipCtrl.SetToolRect(this, 1, &rcItem);
- }
- }
- }
- }
- }
- if (nIndex != m_nHoverIndex || m_bHoverLorR != bHoverLorR)
- {
- m_nHoverIndex = nIndex;
- m_bHoverLorR = bHoverLorR;
- Invalidate(FALSE);
- }
- __super::OnMouseMove(nFlags, point);
- }
- void CSkinToolBar::OnDestroy()
- {
- __super::OnDestroy();
- if (m_ToolTipCtrl.GetSafeHwnd())
- m_ToolTipCtrl.DestroyWindow();
- m_ToolTipCtrl.m_hWnd = NULL;
- CSkinToolBarItem * lpItem;
- for (int i = 0; i < (int)m_arrItems.size(); i++)
- {
- lpItem = m_arrItems[i];
- if (lpItem != NULL)
- delete lpItem;
- }
- m_arrItems.clear();
- RenderEngine->RemoveImage(m_lpBgImg);
- m_nPressIndex = m_nHoverIndex = -1;
- m_bPressLorR = m_bHoverLorR = FALSE;
- m_bMouseTracking = FALSE;
- m_nLeft = m_nTop = 0;
- m_bAutoSize = FALSE;
- }
- LRESULT CSkinToolBar::OnMouseLeave( WPARAM wparam, LPARAM lparam )
- {
- m_bMouseTracking = FALSE;
- int nIndex = -1;
- if (nIndex != m_nHoverIndex)
- {
- m_nHoverIndex = nIndex;
- Invalidate(FALSE);
- }
- return TRUE;
- }
- BOOL CSkinToolBar::PreTranslateMessage(MSG* pMsg)
- {
- if (m_ToolTipCtrl.GetSafeHwnd())
- m_ToolTipCtrl.RelayEvent(pMsg);
- return __super::PreTranslateMessage(pMsg);
- }
- CSkinToolBarItem * CSkinToolBar::GetItemByIndex(int nIndex)
- {
- if (nIndex >= 0 && nIndex < (int)m_arrItems.size())
- return m_arrItems[nIndex];
- else
- return NULL;
- }
- CSkinToolBarItem * CSkinToolBar::GetItemByID(int nID)
- {
- CSkinToolBarItem * lpItem;
- for (int i = 0; i < (int)m_arrItems.size(); i++)
- {
- lpItem = m_arrItems[i];
- if (lpItem != NULL && lpItem->m_nID == nID)
- return lpItem;
- }
- return NULL;
- }
- int CSkinToolBar::HitTest(POINT pt)
- {
- CSkinToolBarItem * lpItem;
- int nLeft = m_nLeft, nTop = m_nTop;
- CRect rcItem;
- for (int i = 0; i < (int)m_arrItems.size(); i++)
- {
- lpItem = m_arrItems[i];
- if (lpItem != NULL)
- {
- rcItem = CRect(nLeft, nTop, nLeft+lpItem->m_nWidth, nTop+lpItem->m_nHeight);
- if (rcItem.PtInRect(pt))
- {
- if (lpItem->m_dwStyle & STBI_STYLE_SEPARTOR)
- return -1;
- else
- return i;
- }
- nLeft += lpItem->m_nWidth;
- nLeft += lpItem->m_nPadding;
- }
- }
- return -1;
- }
- void CSkinToolBar::DrawItem(CDC*pDC, int nIndex)
- {
- CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
- if (NULL == lpItem)
- return;
- CRect rcItem;
- GetItemRectByIndex(nIndex, rcItem);
- CRect rcLeft, rcRight;
- if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN
- || lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN)
- {
- rcLeft = rcItem;
- rcLeft.right = rcLeft.left + lpItem->m_nLeftWidth;
- rcRight = rcItem;
- rcRight.left += lpItem->m_nLeftWidth;
- rcRight.right = rcRight.left + lpItem->m_nRightWidth;
- }
- if (lpItem->m_dwStyle & STBI_STYLE_SEPARTOR)
- {
- if (lpItem->m_lpSepartorImg != NULL && !lpItem->m_lpSepartorImg->IsNull())
- lpItem->m_lpSepartorImg->Draw(pDC, rcItem);
- return;
- }
- if ((lpItem->m_dwStyle & STBI_STYLE_CHECK) && lpItem->m_bChecked)
- {
- if (lpItem->m_lpBgImgD != NULL && !lpItem->m_lpBgImgD->IsNull())
- lpItem->m_lpBgImgD->Draw(pDC, rcItem);
- rcItem.OffsetRect(1, 1);
- if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN)
- {
- if (lpItem->m_lpLeftD != NULL && !lpItem->m_lpLeftD->IsNull())
- lpItem->m_lpLeftD->Draw(pDC, rcLeft);
- rcLeft.OffsetRect(1, 1);
- }
- if (m_nPressIndex == nIndex)
- {
- if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN)
- {
- if (!m_bPressLorR)
- {
- if (lpItem->m_lpRightD != NULL && !lpItem->m_lpRightD->IsNull())
- lpItem->m_lpRightD->Draw(pDC, rcRight);
- rcRight.OffsetRect(1, 1);
- }
- }
- }
- else if (m_nHoverIndex == nIndex)
- {
- if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN)
- {
- if (!m_bHoverLorR)
- {
- if (lpItem->m_lpRightH != NULL && !lpItem->m_lpRightH->IsNull())
- lpItem->m_lpRightH->Draw(pDC, rcRight);
- }
- }
- }
- }
- else
- {
- if (m_nPressIndex == nIndex)
- {
- if (lpItem->m_lpBgImgD != NULL && !lpItem->m_lpBgImgD->IsNull())
- lpItem->m_lpBgImgD->Draw(pDC, rcItem);
- if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN)
- {
- if (m_bPressLorR)
- {
- if (lpItem->m_lpLeftD != NULL && !lpItem->m_lpLeftD->IsNull())
- lpItem->m_lpLeftD->Draw(pDC, rcLeft);
- }
- else
- {
- if (lpItem->m_lpRightD != NULL && !lpItem->m_lpRightD->IsNull())
- lpItem->m_lpRightD->Draw(pDC, rcRight);
- }
- }
- rcItem.OffsetRect(1, 1);
- if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN
- || lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN)
- {
- if (m_bPressLorR)
- rcLeft.OffsetRect(1, 1);
- else
- rcRight.OffsetRect(1, 1);
- }
- }
- else if (m_nHoverIndex == nIndex)
- {
- if (lpItem->m_lpBgImgH != NULL && !lpItem->m_lpBgImgH->IsNull())
- lpItem->m_lpBgImgH->Draw(pDC, rcItem);
- if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN)
- {
- if (m_bHoverLorR)
- {
- if (lpItem->m_lpLeftH != NULL && !lpItem->m_lpLeftH->IsNull())
- lpItem->m_lpLeftH->Draw(pDC, rcLeft);
- }
- else
- {
- if (lpItem->m_lpRightH != NULL && !lpItem->m_lpRightH->IsNull())
- lpItem->m_lpRightH->Draw(pDC, rcRight);
- }
- }
- }
- }
- BOOL bHasText = FALSE;
- if (lpItem->m_strText.GetLength() > 0)
- bHasText = TRUE;
- BOOL bHasIcon = FALSE;
- if (lpItem->m_lpIconImg != NULL && !lpItem->m_lpIconImg->IsNull())
- bHasIcon = TRUE;
- if (!(lpItem->m_dwStyle & STBI_STYLE_DROPDOWN
- || lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN))
- rcLeft = rcItem;
- if (bHasIcon && bHasText) // 带图标和文字
- {
- int cxIcon = lpItem->m_lpIconImg->GetWidth();
- int cyIcon = lpItem->m_lpIconImg->GetHeight();
- int nMode = pDC->SetBkMode(TRANSPARENT);
- HFONT hFont = (HFONT)SendMessage(WM_GETFONT, 0, 0);
- if (NULL == hFont)
- hFont = (HFONT)::GetStockObject(DEFAULT_GUI_FONT);
- HFONT hOldFont = (HFONT)pDC->SelectObject(hFont);
- CRect rcText(0,0,0,0); // 计算文字宽高
- pDC->DrawText(lpItem->m_strText, lpItem->m_strText.GetLength(), &rcText, DT_SINGLELINE | DT_CALCRECT);
- int cx = cxIcon+1+rcText.Width();
- int cy = cyIcon;
- CRect rcCenter;
- CalcCenterRect(rcLeft, cx, cy, rcCenter);
- CRect rcIcon(rcCenter.left, rcCenter.top, rcCenter.left+cxIcon, rcCenter.bottom);
- lpItem->m_lpIconImg->Draw(pDC, rcIcon);
- UINT nFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
- rcText = CRect(rcIcon.right+1, rcLeft.top, rcIcon.right+1+rcText.Width(), rcLeft.bottom);
- pDC->DrawText(lpItem->m_strText, lpItem->m_strText.GetLength(), &rcText, nFormat);
- pDC->SelectObject(hOldFont);
- pDC->SetBkMode(nMode);
- }
- else if (bHasIcon) // 仅图标
- {
- int cxIcon = lpItem->m_lpIconImg->GetWidth();
- int cyIcon = lpItem->m_lpIconImg->GetHeight();
- CRect rcIcon;
- CalcCenterRect(rcLeft, cxIcon, cyIcon, rcIcon);
- lpItem->m_lpIconImg->Draw(pDC, rcIcon);
- }
- else if (bHasText) // 仅文字
- {
- UINT nFormat = DT_CENTER | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
- int nMode = pDC->SetBkMode( TRANSPARENT);
- HFONT hFont = (HFONT)SendMessage(WM_GETFONT, 0, 0);
- if (NULL == hFont)
- hFont = (HFONT)::GetStockObject(DEFAULT_GUI_FONT);
- HFONT hOldFont = (HFONT)pDC->SelectObject(hFont);
- pDC->DrawText(lpItem->m_strText, lpItem->m_strText.GetLength(), &rcLeft, nFormat);
- pDC->SelectObject(hOldFont);
- pDC->SetBkMode(nMode);
- }
- if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN
- || lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN)
- {
- if (lpItem->m_lpArrowImg != NULL && !lpItem->m_lpArrowImg->IsNull())
- {
- int cxArrow = lpItem->m_lpArrowImg->GetWidth();
- int cyArrow = lpItem->m_lpArrowImg->GetHeight();
- CRect rcArrow;
- CalcCenterRect(rcRight, cxArrow, cyArrow, rcArrow);
- rcArrow.left = rcRight.left;
- rcArrow.right = rcArrow.left + cxArrow;
- lpItem->m_lpArrowImg->Draw(pDC, rcArrow);
- }
- }
- }
- BOOL CSkinToolBar::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
- {
- return __super::Create(NULL,NULL,WS_CHILD|WS_VISIBLE,rect,pParentWnd, nID);
- }
- void CSkinToolBar::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )
- {
- ISkinControl::SetAttribute(pstrName,pstrValue);
- }
- void CSkinToolBar::ParseItem( CXmlNode *root )
- {
- }
- BOOL CSkinToolBar::CreateControl( CWnd* pParentWnd )
- {
- if( !Create(WS_CHILD|WS_VISIBLE | WS_TABSTOP,CRect(0,0,0,0),pParentWnd,0) )
- return FALSE;
- m_pOwnWnd = this;
- return TRUE;
- }
|