15,978
社区成员
发帖
与我相关
我的任务
分享
// draw tab item context: possible icon and text
void CXPTabCtrl::DrawTabItem(CDC* pDC, int ixItem, const CRect& rcItemC, UINT uiFlags)
{
TC_ITEM tci; CString sText;
tci.mask =TCIF_TEXT | TCIF_IMAGE;
tci.pszText =sText.GetBuffer(128);
tci.cchTextMax=127;
GetItem(ixItem,&tci);
sText.ReleaseBuffer();
BOOL bSel =(uiFlags&2)?TRUE:FALSE;
BOOL bBottom=(uiFlags&8)?TRUE:FALSE;
CRect rcItem=rcItemC;
if(bSel) rcItem.bottom -= 1;
else rcItem.bottom += 2;
rcItem.left+=(bBottom?3:6); // text & icon
rcItem.top +=(bBottom?3:2) + (bSel ? 1 : (bBottom?0:3));
int nOldMode=pDC->SetBkMode(TRANSPARENT);
HIMAGELIST hilTabs = (HIMAGELIST)TabCtrl_GetImageList(GetSafeHwnd()); // icon
if(hilTabs && tci.iImage>=0)
{ ImageList_Draw(hilTabs, tci.iImage, *pDC, rcItem.left+(bSel?2:0), rcItem.top+(bSel?0:-2), ILD_TRANSPARENT);
rcItem.left+=19;
}
else rcItem.OffsetRect(-2,0);
if(sText.GetLength())
{ CFont* pOldFont=pDC->SelectObject(GetFont()); // prepare dc
rcItem.right-=3; // text
CRect rect(0,0,rcItem.Width(),20);
::DrawText(pDC->GetSafeHdc(),sText.GetBuffer(sText.GetLength()+4),-1,rect,DT_CALCRECT|DT_SINGLELINE|DT_MODIFYSTRING|DT_END_ELLIPSIS);
sText.ReleaseBuffer();
rcItem.OffsetRect((bBottom?-1:0),(bSel?1:-1));
pDC->DrawText(sText, rcItem, DT_NOPREFIX|DT_CENTER);
pDC->SelectObject(pOldFont);
}
pDC->SetBkMode(nOldMode);
}
int CXPTabCtrl::SetCurSel(int nItem)
{
if( nItem < 0 || nItem >= m_nNumOfPages)
return -1;
int ret = m_nCurrentPage;
if(m_nCurrentPage != nItem )
{
m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE);
m_nCurrentPage = nItem;
m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW);
// m_pPages[m_nCurrentPage]->SetFocus();
CTabCtrl::SetCurSel(nItem);
}
return ret;
}
int CXPTabCtrl::GetCurSel()
{
return CTabCtrl::GetCurSel();
}
BOOL CXPTabCtrl::AddPage(LPCTSTR title, CDialog *pDialog,UINT ID)
{
if( MAXPAGE == m_nNumOfPages )
return FALSE;
m_nNumOfPages++;
m_pPages[m_nNumOfPages-1] = pDialog;
m_IDD[m_nNumOfPages-1] = ID;
m_Title[m_nNumOfPages-1] = title;
return TRUE;
}
void CXPTabCtrl::SetRect()
{
CRect tabRect, itemRect;
int nX, nY, nXc, nYc;
GetClientRect(&tabRect);
GetItemRect(0, &itemRect);
nX=itemRect.left;
nY=itemRect.bottom+1;
nXc=tabRect.right-itemRect.left-2;
nYc=tabRect.bottom-nY-2;
m_pPages[0]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW);
for( int nCount=1; nCount < m_nNumOfPages; nCount++ )
m_pPages[nCount]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW);
}
void CXPTabCtrl::Show()
{
for( int i=0; i < m_nNumOfPages; i++ )
{
m_pPages[i]->Create( m_IDD[i], this );
InsertItem( i, m_Title[i] );
}
m_pPages[0]->ShowWindow(SW_SHOW);
for( i=1; i < m_nNumOfPages; i++)
m_pPages[i]->ShowWindow(SW_HIDE);
SetRect();
}
void CXPTabCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
CTabCtrl::OnLButtonDown(nFlags, point);
if(m_nCurrentPage != GetCurFocus())
{
m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE);
m_nCurrentPage=GetCurFocus();
m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW);
// m_pPages[m_nCurrentPage]->SetFocus();
}
}
void CXPTabCtrl::PreSubclassWindow()
{
ModifyStyle(0, TCS_OWNERDRAWFIXED);
CTabCtrl::PreSubclassWindow();
}
CHallDlg m_hall ;
TabOrientation(e_tabLeft);
m_tabCtrl.AddPage("dlg", &m_hall,IDD_HALL_DIALOG);
m_tabCtrl.Show();