| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847 |
- // SkinTabCtrl.cpp : 实现文件
- //
- #include "stdafx.h"
- #include "SkinTabCtrl.h"
- // CSkinTabCtrl
- IMPLEMENT_DYNAMIC(CSkinTabCtrl, CTabCtrl)
- CSkinTabCtrlItem::CSkinTabCtrlItem(void)
- {
- m_nID = 0;
- m_dwStyle = STCI_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_lpArrowImgH = m_lpArrowImgD = NULL;
- m_lpIconImg = m_lpSelIconImg = NULL;
- }
- CSkinTabCtrlItem::~CSkinTabCtrlItem(void)
- {
- RenderEngine->RemoveImage(m_lpBgImgN);
- RenderEngine->RemoveImage(m_lpBgImgH);
- RenderEngine->RemoveImage(m_lpBgImgD);
- RenderEngine->RemoveImage(m_lpArrowImgH);
- RenderEngine->RemoveImage(m_lpArrowImgD);
- RenderEngine->RemoveImage(m_lpIconImg);
- RenderEngine->RemoveImage(m_lpSelIconImg);
- }
- CSkinTabCtrl::CSkinTabCtrl()
- {
- m_lpBack = NULL;
- m_lpItemBgImgN = m_lpItemBgImgH = m_lpItemBgImgD = NULL;
- m_lpArrowImgH = m_lpArrowImgD = NULL;
- m_nSelIndex = m_nHoverIndex = -1;
- m_bPressArrow = FALSE;
- m_bMouseTracking = FALSE;
- m_nLeft = m_nTop = 0;
- m_bTransparent = FALSE;
- m_ptPaddingText.SetPoint(0,0);
- }
- CSkinTabCtrl::~CSkinTabCtrl()
- {
- }
- BEGIN_MESSAGE_MAP(CSkinTabCtrl, CTabCtrl)
- ON_WM_ERASEBKGND()
- ON_WM_PAINT()
- ON_WM_LBUTTONDOWN()
- ON_WM_LBUTTONUP()
- ON_WM_MOUSEMOVE()
- ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
- ON_WM_DESTROY()
- END_MESSAGE_MAP()
- // CSkinTabCtrl 消息处理程序
- void CSkinTabCtrl::SetLeftTop(int nLeft, int nTop)
- {
- m_nLeft = nLeft;
- m_nTop = nTop;
- }
- BOOL CSkinTabCtrl::SetBackImage(LPCTSTR lpszFileName, CONST LPRECT lprcNinePart)
- {
- RenderEngine->RemoveImage(m_lpBack);
- m_lpBack = RenderEngine->GetImage(lpszFileName);
- if (m_lpBack != NULL)
- m_lpBack->SetNinePart(lprcNinePart);
- if (NULL == m_lpBack)
- return FALSE;
- else
- return TRUE;
- }
- BOOL CSkinTabCtrl::SetItemsImage(LPCTSTR lpNormal, LPCTSTR lpHighlight,LPCTSTR lpDown, CONST LPRECT lprcNinePart)
- {
- RenderEngine->RemoveImage(m_lpItemBgImgN);
- RenderEngine->RemoveImage(m_lpItemBgImgH);
- RenderEngine->RemoveImage(m_lpItemBgImgD);
- m_lpItemBgImgN = RenderEngine->GetImage(lpNormal);
- m_lpItemBgImgH = RenderEngine->GetImage(lpHighlight);
- m_lpItemBgImgD = RenderEngine->GetImage(lpDown);
- if (m_lpItemBgImgN != NULL)
- m_lpItemBgImgN->SetNinePart(lprcNinePart);
- if (m_lpItemBgImgH != NULL)
- m_lpItemBgImgH->SetNinePart(lprcNinePart);
- if (m_lpItemBgImgD != NULL)
- m_lpItemBgImgD->SetNinePart(lprcNinePart);
- if ((lpNormal != NULL && NULL == m_lpItemBgImgN) ||
- (lpHighlight != NULL && NULL == m_lpItemBgImgH) ||
- (lpDown != NULL && NULL == m_lpItemBgImgD))
- return FALSE;
- else
- return TRUE;
- }
- BOOL CSkinTabCtrl::SetItemsArrowImage(LPCTSTR lpHighlight, LPCTSTR lpDown)
- {
- RenderEngine->RemoveImage(m_lpArrowImgH);
- RenderEngine->RemoveImage(m_lpArrowImgD);
- m_lpArrowImgH = RenderEngine->GetImage(lpHighlight);
- m_lpArrowImgD = RenderEngine->GetImage(lpDown);
- if ((lpHighlight != NULL && NULL == m_lpArrowImgH) ||
- (lpDown != NULL && NULL == m_lpArrowImgD))
- return FALSE;
- else
- return TRUE;
- }
- int CSkinTabCtrl::GetItemCount()
- {
- return m_ItemArray.size();
- }
- int CSkinTabCtrl::GetCurSel()
- {
- return m_nSelIndex;
- }
- void CSkinTabCtrl::SetCurSel(int nCurSel)
- {
- m_nSelIndex = nCurSel;
- Invalidate(FALSE);
- }
- int CSkinTabCtrl::AddItem(int nID, DWORD dwStyle)
- {
- CSkinTabCtrlItem * lpItem = new CSkinTabCtrlItem;
- if (NULL == lpItem)
- return -1;
- lpItem->m_nID = nID;
- lpItem->m_dwStyle = dwStyle;
- m_ItemArray.push_back(lpItem);
- __super::InsertItem(nID,TEXT(""));
-
- SetItemPadding(nID,1);
- return m_ItemArray.size() - 1;
- }
- void CSkinTabCtrl::SetItemID(int nIndex, int nID)
- {
- CSkinTabCtrlItem * lpItem = GetItemByIndex(nIndex);
- if (lpItem != NULL)
- lpItem->m_nID = nID;
- }
- void CSkinTabCtrl::SetItemStyle(int nIndex, int dwStyle)
- {
- CSkinTabCtrlItem * lpItem = GetItemByIndex(nIndex);
- if (lpItem != NULL)
- lpItem->m_dwStyle = dwStyle;
- }
- CSize CSkinTabCtrl::SetItemSize(CSize size,CONST LPSIZE lpszArrow/*=NULL*/)
- {
- for (int i=0;i<(int)m_ItemArray.size();i++)
- {
- CSkinTabCtrlItem * lpItem = m_ItemArray.at(i);
- lpItem->m_nWidth = size.cx;
- lpItem->m_nHeight = size.cy;
- lpItem->m_nLeftWidth = lpszArrow ? lpszArrow->cx : 0;
- lpItem->m_nRightWidth = lpszArrow ? lpszArrow->cy : 0;
- }
- return __super::SetItemSize(size);
- }
- void CSkinTabCtrl::SetItemPadding(int nIndex, int nPadding)
- {
- CSkinTabCtrlItem * lpItem = GetItemByIndex(nIndex);
- if (lpItem != NULL)
- lpItem->m_nPadding = nPadding;
- }
- void CSkinTabCtrl::SetItemText(int nIndex, LPCTSTR lpszText)
- {
- CSkinTabCtrlItem * lpItem = GetItemByIndex(nIndex);
- if (lpItem != NULL)
- lpItem->m_strText = lpszText;
- }
- void CSkinTabCtrl::SetItemToolTipText(int nIndex, LPCTSTR lpszText)
- {
- CSkinTabCtrlItem * lpItem = GetItemByIndex(nIndex);
- if (lpItem != NULL)
- lpItem->m_strToolTipText = lpszText;
- }
- BOOL CSkinTabCtrl::SetItemBack(int nIndex, LPCTSTR lpNormal,
- LPCTSTR lpHighlight, LPCTSTR lpDown, CONST LPRECT lprcNinePart)
- {
- CSkinTabCtrlItem * 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 CSkinTabCtrl::SetItemArrowImage(int nIndex, LPCTSTR lpHighlight, LPCTSTR lpDown)
- {
- CSkinTabCtrlItem * lpItem = GetItemByIndex(nIndex);
- if (NULL == lpItem)
- return FALSE;
- RenderEngine->RemoveImage(lpItem->m_lpArrowImgH);
- RenderEngine->RemoveImage(lpItem->m_lpArrowImgD);
- lpItem->m_lpArrowImgH = RenderEngine->GetImage(lpHighlight);
- lpItem->m_lpArrowImgD = RenderEngine->GetImage(lpDown);
- if ((lpHighlight != NULL && NULL == lpItem->m_lpArrowImgH) ||
- (lpDown != NULL && NULL == lpItem->m_lpArrowImgD))
- return FALSE;
- else
- return TRUE;
- }
- BOOL CSkinTabCtrl::SetItemIconImage(int nIndex, LPCTSTR lpIcon, LPCTSTR lpSelIcon)
- {
- CSkinTabCtrlItem * lpItem = GetItemByIndex(nIndex);
- if (NULL == lpItem)
- return FALSE;
- RenderEngine->RemoveImage(lpItem->m_lpIconImg);
- RenderEngine->RemoveImage(lpItem->m_lpSelIconImg);
- lpItem->m_lpIconImg = RenderEngine->GetImage(lpIcon);
- lpItem->m_lpSelIconImg = RenderEngine->GetImage(lpSelIcon);
- if ((lpIcon != NULL && NULL == lpItem->m_lpIconImg) ||
- (lpSelIcon != NULL && NULL == lpItem->m_lpSelIconImg))
- return FALSE;
- else
- return TRUE;
- }
- BOOL CSkinTabCtrl::GetItemRectByIndex(int nIndex, CRect& rect)
- {
- CSkinTabCtrlItem * lpItem;
- int nLeft = m_nLeft, nTop = m_nTop;
- for (int i = 0; i < (int)m_ItemArray.size(); i++)
- {
- lpItem = m_ItemArray[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 CSkinTabCtrl::GetItemRectByID(int nID, CRect& rect)
- {
- CSkinTabCtrlItem * lpItem;
- int nLeft = m_nLeft, nTop = m_nTop;
- for (int i = 0; i < (int)m_ItemArray.size(); i++)
- {
- lpItem = m_ItemArray[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;
- }
- void CSkinTabCtrl::DrawItem(CDC*pDC, int nIndex)
- {
- CSkinTabCtrlItem * lpItem = GetItemByIndex(nIndex);
- if (NULL == lpItem) return;
- CRect rcItem;
- GetItemRectByIndex(nIndex, rcItem);
- if (m_nSelIndex == nIndex)
- {
- if (lpItem->m_lpBgImgD != NULL && !lpItem->m_lpBgImgD->IsNull())
- lpItem->m_lpBgImgD->Draw(pDC, rcItem);
- else if (m_lpItemBgImgD != NULL && !m_lpItemBgImgD->IsNull())
- m_lpItemBgImgD->Draw(pDC, rcItem);
- }
- else if (m_nHoverIndex == nIndex)
- {
- if (lpItem->m_lpBgImgH != NULL && !lpItem->m_lpBgImgH->IsNull())
- lpItem->m_lpBgImgH->Draw(pDC, rcItem);
- else if (m_lpItemBgImgH != NULL && !m_lpItemBgImgH->IsNull())
- m_lpItemBgImgH->Draw(pDC, rcItem);
- }
- else
- {
- if (lpItem->m_lpBgImgN != NULL && !lpItem->m_lpBgImgN->IsNull())
- lpItem->m_lpBgImgN->Draw(pDC, rcItem);
- else if (m_lpItemBgImgN != NULL && !m_lpItemBgImgN->IsNull())
- m_lpItemBgImgN->Draw(pDC, rcItem);
- }
- CImageEx * lpIconImg = NULL;
- if (m_nSelIndex == nIndex)
- lpIconImg = lpItem->m_lpSelIconImg;
- else
- lpIconImg = lpItem->m_lpIconImg;
- BOOL bHasText = FALSE;
- if (lpItem->m_strText.GetLength() > 0)
- bHasText = TRUE;
- BOOL bHasIcon = FALSE;
- if (lpIconImg != NULL && !lpIconImg->IsNull())
- bHasIcon = TRUE;
- if (bHasIcon && bHasText) // 带图标和文字
- {
- int cxIcon = lpIconImg->GetWidth();
- int cyIcon = lpIconImg->GetHeight();
- int nMode = pDC->SetBkMode(TRANSPARENT);
- pDC->SelectObject(GetCtrlFont());
- pDC->SetTextColor(m_colNormalText);
- CRect rcText(0,0,0,0); // 计算文字宽高
- CRect rcIcon(0,0,0,0);
- pDC->DrawText(lpItem->m_strText, lpItem->m_strText.GetLength(), &rcText, DT_SINGLELINE | DT_CALCRECT);
- if ( (m_ptPaddingText.x == 0) && (m_ptPaddingText.y == 0) )
- {
- int cx = cxIcon+1+rcText.Width();
- int cy = cyIcon;
- CRect rcCenter;
- CalcCenterRect(rcItem, cx, cy, rcCenter);
- rcIcon.SetRect(rcCenter.left, rcCenter.top, rcCenter.left+cxIcon, rcCenter.bottom);
- rcText = CRect(rcIcon.right+1, rcItem.top, rcIcon.right+1+rcText.Width(), rcItem.bottom);
- }
- else
- {
- CRect rcCenter;
- CalcCenterRect(rcItem, cxIcon, cyIcon, rcIcon);
- rcText = CRect(rcItem.left+m_ptPaddingText.x,rcItem.top+m_ptPaddingText.y,rcItem.left+m_ptPaddingText.x+rcText.Width(),rcItem.top+m_ptPaddingText.y+rcText.Height());
- }
-
- lpIconImg->Draw(pDC, rcIcon);
- UINT nFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
-
- pDC->DrawText(lpItem->m_strText, lpItem->m_strText.GetLength(), &rcText, nFormat);
- pDC->SetBkMode(nMode);
- }
- else if (bHasIcon) // 仅图标
- {
- int cxIcon = lpIconImg->GetWidth();
- int cyIcon = lpIconImg->GetHeight();
- CRect rcIcon;
- CalcCenterRect(rcItem, cxIcon, cyIcon, rcIcon);
- lpIconImg->Draw(pDC, rcIcon);
- }
- else if (bHasText) // 仅文字
- {
- UINT nFormat = DT_CENTER | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
- int nMode = pDC->SetBkMode(TRANSPARENT);
- pDC->SetTextColor(m_colNormalText);
- pDC->SelectObject(GetCtrlFont());
- pDC->DrawText(lpItem->m_strText, lpItem->m_strText.GetLength(), &rcItem, nFormat);
- pDC->SetBkMode(nMode);
- }
- if (m_nSelIndex == nIndex)
- {
- if (lpItem->m_dwStyle & STCI_STYLE_DROPDOWN)
- {
- CRect rcArrow;
- rcArrow.left = rcItem.left+lpItem->m_nLeftWidth;
- rcArrow.top = rcItem.top;
- rcArrow.bottom = rcItem.bottom;
- rcArrow.right = rcArrow.left + lpItem->m_nRightWidth;
- if (m_bPressArrow)
- {
- if (lpItem->m_lpArrowImgD != NULL && !lpItem->m_lpArrowImgD->IsNull())
- lpItem->m_lpArrowImgD->Draw(pDC, rcArrow);
- else if (m_lpArrowImgD != NULL && !m_lpArrowImgD->IsNull())
- m_lpArrowImgD->Draw(pDC, rcArrow);
- }
- else if (m_nHoverIndex == nIndex)
- {
- if (lpItem->m_lpArrowImgH != NULL && !lpItem->m_lpArrowImgH->IsNull())
- lpItem->m_lpArrowImgH->Draw(pDC, rcArrow);
- else if (m_lpArrowImgH != NULL && !m_lpArrowImgH->IsNull())
- m_lpArrowImgH->Draw(pDC, rcArrow);
- }
- }
- }
- }
- BOOL CSkinTabCtrl::OnEraseBkgnd(CDC* pDC)
- {
- return TRUE;
- }
- void CSkinTabCtrl::OnPaint()
- {
- CPaintDC dc(this);
- CRect rcClient;
- GetClientRect(&rcClient);
- CMemoryDC BufferDC(&dc, rcClient);
- DrawParentWndBg(GetSafeHwnd(),BufferDC.m_hDC);
- if (m_lpBack != NULL && !m_lpBack->IsNull())
- m_lpBack->Draw(&BufferDC, rcClient);
- for (int i = 0; i < (int)m_ItemArray.size(); i++)
- {
- DrawItem(&BufferDC, i);
- }
- }
- void CSkinTabCtrl::OnLButtonDown(UINT nFlags, CPoint point)
- {
- SetFocus();
- int nIndex = HitTest(point);
- if (nIndex != -1)
- {
- if (nIndex != m_nSelIndex)
- {
- m_nSelIndex = nIndex;
- Invalidate(FALSE);
- NMHDR nmhdr = {m_hWnd, GetDlgCtrlID(), TCN_SELCHANGE};
- ::SendMessage(::GetParent(m_hWnd), WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&nmhdr);
- }
- else
- {
- CSkinTabCtrlItem * lpItem = GetItemByIndex(nIndex);
- if (lpItem != NULL && lpItem->m_dwStyle & STCI_STYLE_DROPDOWN)
- {
- CRect rcItem;
- GetItemRectByIndex(nIndex, rcItem);
- CRect rcArrow;
- rcArrow.left = rcItem.left+lpItem->m_nLeftWidth;
- rcArrow.right = rcArrow.left + lpItem->m_nRightWidth;
- rcArrow.top = rcItem.top;
- rcArrow.bottom = rcItem.bottom;
- if (rcArrow.PtInRect(point))
- m_bPressArrow = TRUE;
- else
- m_bPressArrow = FALSE;
- if (m_bPressArrow)
- {
- Invalidate(FALSE);
- NMHDR nmhdr = {0};
- nmhdr.hwndFrom = m_hWnd;
- nmhdr.idFrom = GetDlgCtrlID();
- nmhdr.code = TCN_DROPDOWN;
- ::SendMessage(::GetParent(m_hWnd), WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&nmhdr);
- m_bPressArrow = FALSE;
- Invalidate(FALSE);
- }
- }
- }
- }
- __super::OnLButtonDown(nFlags, point);
- }
- void CSkinTabCtrl::OnMouseMove(UINT nFlags, CPoint point)
- {
- if (!m_bMouseTracking)
- {
- TrackMouseLeave(GetSafeHwnd());
- m_bMouseTracking = TRUE;
- }
- int nIndex;
- nIndex = HitTest(point);
- if (nIndex != -1)
- {
- CSkinTabCtrlItem * lpItem = GetItemByIndex(nIndex);
- if (lpItem != NULL)
- {
- CRect rcItem;
- GetItemRectByIndex(nIndex, rcItem);
- 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_nHoverIndex = nIndex;
- Invalidate();
- }
- __super::OnMouseMove(nFlags, point);
- }
- LRESULT CSkinTabCtrl::OnMouseLeave(WPARAM wparam, LPARAM lparam)
- {
- m_bMouseTracking = FALSE;
- int nIndex = -1;
- if (nIndex != m_nHoverIndex)
- {
- m_nHoverIndex = nIndex;
- Invalidate();
- }
- return 0;
- }
- void CSkinTabCtrl::OnDestroy()
- {
- __super::OnDestroy();
- if (m_ToolTipCtrl.GetSafeHwnd())
- m_ToolTipCtrl.DestroyWindow();
- m_ToolTipCtrl.m_hWnd = NULL;
- CSkinTabCtrlItem * lpItem;
- for (int i = 0; i < (int)m_ItemArray.size(); i++)
- {
- lpItem = m_ItemArray[i];
- if (lpItem != NULL)
- delete lpItem;
- }
- m_ItemArray.clear();
- RenderEngine->RemoveImage(m_lpBack);
- RenderEngine->RemoveImage(m_lpItemBgImgN);
- RenderEngine->RemoveImage(m_lpItemBgImgH);
- RenderEngine->RemoveImage(m_lpItemBgImgD);
- RenderEngine->RemoveImage(m_lpArrowImgH);
- RenderEngine->RemoveImage(m_lpArrowImgD);
- m_nSelIndex = m_nHoverIndex = -1;
- m_bPressArrow = FALSE;
- m_bMouseTracking = FALSE;
- m_nLeft = m_nTop = 0;
- m_bTransparent = FALSE;
- }
- BOOL CSkinTabCtrl::PreTranslateMessage(MSG* pMsg)
- {
- if (m_ToolTipCtrl.GetSafeHwnd())
- m_ToolTipCtrl.RelayEvent(pMsg);
- return __super::PreTranslateMessage(pMsg);
- }
- CSkinTabCtrlItem * CSkinTabCtrl::GetItemByIndex(int nIndex)
- {
- if (nIndex >= 0 && nIndex < (int)m_ItemArray.size())
- return m_ItemArray[nIndex];
- else
- return NULL;
- }
- CSkinTabCtrlItem * CSkinTabCtrl::GetItemByID(int nID)
- {
- CSkinTabCtrlItem * lpItem;
- for (int i = 0; i < (int)m_ItemArray.size(); i++)
- {
- lpItem = m_ItemArray[i];
- if (lpItem != NULL && lpItem->m_nID == nID)
- return lpItem;
- }
- return NULL;
- }
- int CSkinTabCtrl::HitTest(POINT pt)
- {
- CSkinTabCtrlItem * lpItem;
- int nLeft = m_nLeft, nTop = m_nTop;
- CRect rcItem;
- for (int i = 0; i < (int)m_ItemArray.size(); i++)
- {
- lpItem = m_ItemArray[i];
- if (lpItem != NULL)
- {
- rcItem = CRect(nLeft, nTop, nLeft+lpItem->m_nWidth, nTop+lpItem->m_nHeight);
- if (rcItem.PtInRect(pt))
- return i;
- nLeft += lpItem->m_nWidth;
- nLeft += lpItem->m_nPadding;
- }
- }
- return -1;
- }
- BOOL CSkinTabCtrl::CreateControl( CWnd* pParentWnd )
- {
- if( !Create(WS_CHILD|WS_VISIBLE|WS_TABSTOP|TCS_FIXEDWIDTH,CRect(0,0,0,0),pParentWnd,0) )
- return FALSE;
- m_pOwnWnd = this;
- return TRUE;
- }
- void CSkinTabCtrl::ParseItem( CXmlNode *root )
- {
- if( root == NULL ) return;
- int nAttributes = root->GetAttributeCount();
- LPCTSTR pstrClass = NULL;
- LPCTSTR pstrName = NULL;
- LPCTSTR pstrValue = NULL;
- LPTSTR pstr = NULL;
- pstrClass = root->GetName();
- if( _tcscmp(pstrClass, _T("item")) == 0 )
- {
- DWORD dwStyle = STCI_STYLE_BUTTON;
- LPCTSTR lpszTipText = NULL;
- LPCTSTR lpszText = NULL;
- LPCTSTR lpIcon = NULL,lpSelIcon = NULL;
- for( int i = 0; i < nAttributes; i++ )
- {
- pstrName = root->GetAttributeName(i);
- pstrValue = root->GetAttributeValue(i);
- if( _tcscmp(pstrName, _T("style")) == 0 ) dwStyle = _tcstol(pstrValue, &pstr, 10);
- else if( _tcscmp(pstrName, _T("tiptext")) == 0 ) lpszTipText = pstrValue;
- else if( _tcscmp(pstrName, _T("text")) == 0 ) lpszText = pstrValue;
- else if( _tcscmp(pstrName, _T("iconimage")) == 0 ) lpIcon = pstrValue;
- else if( _tcscmp(pstrName, _T("selimage")) == 0 ) lpSelIcon = pstrValue;
- }
- int nIndex = AddItem(GetItemCount(), dwStyle);
-
- if(lpszTipText != NULL)
- SetItemToolTipText(nIndex, lpszTipText);
-
- if(lpszText != NULL)
- SetItemText(nIndex, lpszText);
- SetItemIconImage(nIndex, lpIcon,lpSelIcon);
- }
- else if( _tcscmp(pstrClass, _T("backimage")) == 0 )
- {
- LPCTSTR pszPath = NULL;
- CRect rcNinepart;
- for( int i = 0; i < nAttributes; i++ )
- {
- pstrName = root->GetAttributeName(i);
- pstrValue = root->GetAttributeValue(i);
- if( _tcscmp(pstrName, _T("path")) == 0 ) pszPath = pstrValue;
- else if( _tcscmp(pstrName, _T("ninepart")) == 0 )
- {
- rcNinepart.left = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr);
- rcNinepart.top = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
- rcNinepart.right = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
- rcNinepart.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
- }
- }
- SetBackImage(pszPath, rcNinepart);
- }
- else if( _tcscmp(pstrClass, _T("itemimage")) == 0 )
- {
- LPCTSTR lpNormal = NULL;
- LPCTSTR lpHighlight = NULL;
- LPCTSTR lpDown = NULL;
- CRect rcNinepart;
- for( int i = 0; i < nAttributes; i++ )
- {
- pstrName = root->GetAttributeName(i);
- pstrValue = root->GetAttributeValue(i);
- if( _tcscmp(pstrName, _T("normal")) == 0 ) lpNormal = pstrValue;
- else if( _tcscmp(pstrName, _T("highlight")) == 0 ) lpHighlight = pstrValue;
- else if( _tcscmp(pstrName, _T("down")) == 0 ) lpDown = pstrValue;
- else if( _tcscmp(pstrName, _T("ninepart")) == 0 )
- {
- rcNinepart.left = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr);
- rcNinepart.top = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
- rcNinepart.right = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
- rcNinepart.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
- }
- }
- SetItemsImage(lpNormal, lpHighlight,lpDown, rcNinepart);
- }
- else if( _tcscmp(pstrClass, _T("itemarrowimage")) == 0 )
- {
- LPCTSTR lpHighlight = NULL;
- LPCTSTR lpDown = NULL;
- for( int i = 0; i < nAttributes; i++ )
- {
- pstrName = root->GetAttributeName(i);
- pstrValue = root->GetAttributeValue(i);
- if( _tcscmp(pstrName, _T("highlight")) == 0 ) lpHighlight = pstrValue;
- else if( _tcscmp(pstrName, _T("down")) == 0 ) lpDown = pstrValue;
- }
- SetItemsArrowImage(lpHighlight,lpDown);
- }
- else if( _tcscmp(pstrClass, _T("itemsize")) == 0 )
- {
- CSize szSzie(0,0),szArrow(0,0);
- for( int i = 0; i < nAttributes; i++ )
- {
- pstrName = root->GetAttributeName(i);
- pstrValue = root->GetAttributeValue(i);
- if( _tcscmp(pstrName, _T("size")) == 0 )
- {
- szSzie.cx = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr);
- szSzie.cy = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
- }
- else if( _tcscmp(pstrName, _T("arrowsize")) == 0 )
- {
- szArrow.cx = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr);
- szArrow.cy = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
- }
- }
- SetItemSize(szSzie,&szArrow);
- }
- }
- void CSkinTabCtrl::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )
- {
- ISkinControl::SetAttribute(pstrName,pstrValue);
- if( _tcscmp(pstrName, _T("paddingtext")) == 0 )
- {
- LPTSTR pstr = NULL;
- m_ptPaddingText.x = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr);
- m_ptPaddingText.y = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
- }
- }
|