📄 cooltabctrl.cpp
字号:
{
::DrawIconEx(pDC->m_hDC,rect.left+3,rect.top + 3,m_hIcon,16,16,0,NULL,DI_NORMAL);
rect.top += 16;
}
if (!m_sText.IsEmpty())
{
///////////显示文字//////////
CString sText = m_sText;
int l = sText.GetLength();
int i=pDC->GetTextExtent(sText).cy;
for(i=0;i<10 && pDC->GetTextExtent(sText).cx > rect.Height();i++,l-=2)
sText = sText.Left(l-2);
if(i > 0)
{
sText = sText.Left(l-2);
sText += "...";
}
LOGFONT stfont;
memset(&stfont,0,sizeof(LOGFONT));
stfont.lfHeight=MulDiv(10,-pDC->GetDeviceCaps(LOGPIXELSY),72);
stfont.lfWeight=FW_NORMAL;
stfont.lfClipPrecision=CLIP_LH_ANGLES;
strcpy(stfont.lfFaceName,"宋体");
stfont.lfEscapement=900;
CFont font,*pOldFont;
font.CreateFontIndirect(&stfont);
pOldFont = pDC->SelectObject(&font);
pDC->TextOut(rect.left+3,rect.bottom,sText );
pDC->SelectObject(pOldFont);
}
}
}
catch(...)
{
}
}
////调整尺寸////
void CCoolTabCtrl::AutoSize()
{
UINT PageCount = m_PageList.GetCount();
if(PageCount < 1) return;
CPageItem *pItem;
POSITION pos;
CRect rect,ClientRect,ItemRect;
GetClientRect(ClientRect);
//ClientRect.DeflateRect(m_nBorder+1,m_nBorder+1);
GetWindowRect(rect);
ScreenToClient(rect);
CDC* pDC = GetDC();
CFont *pOldFont = pDC->SelectObject(&m_font);
try
{
if(m_nStyle&TCS_DOWNBEN)
{
rect.left += 2;
rect.right -= 2;
rect.bottom -= 1;
rect.top = rect.bottom - ITEMBUTTON_HEIGHT + 1;
}
else if(m_nStyle&TCS_UPBEN)
{
rect.left += 2;
rect.right -= 6;
rect.bottom = rect.top + ITEMBUTTON_HEIGHT;
}
else if(m_nStyle&TCS_LEFTBEN)
{
rect.left += 1;
rect.right = rect.left+ITEMBUTTON_HEIGHT-1;
rect.bottom -=6;
rect.top +=6;
}
else if(m_nStyle&TCS_RIGHTBEN)
{
rect.right -=1 ;
rect.left =rect.right-ITEMBUTTON_HEIGHT+1;
rect.bottom -=6;
rect.top +=6;
}
ItemRect = rect;
int AreaWidth = 0,ItemMaxWidth,ItemIndex=0;
ItemMaxWidth = rect.Width()/m_PageList.GetCount();
BOOL bMonoSpace = ((m_nStyle&TCS_MONOSPACE) == TCS_MONOSPACE)?1:0;
////////设置按钮初始宽度,并得到按钮所需占用的总宽度///////
if(m_nStyle&TCS_UPBEN||m_nStyle&TCS_DOWNBEN)
{
for(pos=m_PageList.GetHeadPosition();pos!=NULL;ItemIndex++)
{
pItem=(CPageItem*)m_PageList.GetNext(pos);
if(pItem)
{
if(!bMonoSpace)
ItemMaxWidth = pItem->GetAreaWidth(pDC);
AreaWidth += ItemMaxWidth;
ItemRect.right = ItemRect.left+ItemMaxWidth-1;
pItem->m_rect = ItemRect;
ItemRect.left = ItemRect.right + 1;
if(pItem->m_pWnd)
pItem->m_pWnd->MoveWindow(ClientRect);
}
}
////////当需要的空间大于实际空间时进行调整////
if(AreaWidth > rect.Width() && !bMonoSpace)
{
ItemRect = rect;
int AreaWidth,MaxWidth = rect.Width()/PageCount;
for(pos=m_PageList.GetHeadPosition();pos!=NULL;)
{
pItem=(CPageItem*)m_PageList.GetNext(pos);
if(pItem)
{
AreaWidth = pItem->GetAreaWidth(pDC);
ItemMaxWidth = (MaxWidth < AreaWidth)?MaxWidth:AreaWidth;
ItemRect.right = ItemRect.left+ItemMaxWidth;
pItem->m_rect = ItemRect;
ItemRect.left = ItemRect.right + 1;
}
}
}
}
////////设置按钮初始宽度,并得到按钮所需占用的总宽度///////
else if(m_nStyle&TCS_LEFTBEN||m_nStyle&TCS_RIGHTBEN)
{
for(pos=m_PageList.GetHeadPosition();pos!=NULL;ItemIndex++)
{
pItem=(CPageItem*)m_PageList.GetNext(pos);
if(pItem)
{
if(!bMonoSpace)
ItemMaxWidth = pItem->GetAreaWidth(pDC);
AreaWidth += ItemMaxWidth;
ItemRect.bottom = ItemRect.top+ItemMaxWidth-1;
pItem->m_rect = ItemRect;
ItemRect.top = ItemRect.bottom + 1;
if(pItem->m_pWnd)
pItem->m_pWnd->MoveWindow(ClientRect);
}
}
////////当需要的空间大于实际空间时进行调整////
if(AreaWidth > rect.Height() && !bMonoSpace)
{
ItemRect = rect;
int AreaWidth,MaxWidth = rect.Height()/PageCount;
for(pos=m_PageList.GetHeadPosition();pos!=NULL;)
{
pItem=(CPageItem*)m_PageList.GetNext(pos);
if(pItem)
{
AreaWidth = pItem->GetAreaWidth(pDC);
ItemMaxWidth = (MaxWidth < AreaWidth)?MaxWidth:AreaWidth;
ItemRect.bottom = ItemRect.top+ItemMaxWidth;
pItem->m_rect = ItemRect;
ItemRect.top = ItemRect.bottom + 1;
}
}
}
}
}
catch(...)
{
}
pDC->SelectObject(pOldFont);
ReleaseDC(pDC);
}
void CCoolTabCtrl::SetActivePage(int nIndex)
{
try
{
if(nIndex == m_nActivePage)
return;
CPageItem *pOldItem,*pItem;
if(m_nActivePage >= 0)
{
pOldItem = (CPageItem*)GetPageItem(m_nActivePage);
if(pOldItem)
{
pOldItem->m_pWnd->ShowWindow(SW_HIDE);
}
}
pItem = (CPageItem*)GetPageItem(nIndex);
if(!pItem) return;
m_nActivePage = nIndex;
if(m_nStyle&TCS_ANIMATE)
SetTimer(100,15,NULL);///为了在95或NT4下也有动画效果,没有使用AnimateWindow函数
else
pItem->m_pWnd->ShowWindow(SW_SHOW);
Invalidate();
}
catch(...)
{
}
}
void* CCoolTabCtrl::GetPageItem(UINT nIndex)
{
try
{
CPageItem *pItem = NULL;
POSITION pos = m_PageList.FindIndex(nIndex);
if(pos)
pItem = (CPageItem*)m_PageList.GetAt(pos);
return pItem;
}
catch(...)
{
}
return NULL;
}
void CCoolTabCtrl::UpdateWindow()
{
AutoSize();
if(m_nActivePage < 0)
SetActivePage(0);
else
SetActivePage(m_nActivePage);
Invalidate();
}
void CCoolTabCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
try
{
UINT nItemIndex=0;
POSITION pos;
CPageItem *pItem;
for(pos=m_PageList.GetHeadPosition();pos!=NULL;nItemIndex++)
{
pItem=(CPageItem*)m_PageList.GetNext(pos);
if(pItem)
{
if(pItem->m_rect.PtInRect(point))
{
SetActivePage(nItemIndex);
// Invalidate();
break;
}
}
}
}
catch(...)
{
}
CWnd::OnLButtonDown(nFlags, point);
}
void CCoolTabCtrl::OnSizing(UINT fwSide, LPRECT pRect)
{
CWnd::OnSizing(fwSide, pRect);
m_bEraseBkgnd = FALSE;
AutoSize();
}
void CCoolTabCtrl::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
m_bEraseBkgnd = TRUE;
AutoSize();
Invalidate();
}
void CCoolTabCtrl::DrawFrame(CDC *pDC)
{
CRect rect;
GetClientRect(&rect);
switch(m_nBorder)
{
case 1:
// pDC->Draw3dRect(rect,RGB(0xff,0xff,0xff),RGB(0,0,0));
break;
case 2:
// pDC->Draw3dRect(rect,RGB(0xff,0xff,0xff),RGB(0,0,0));
rect.DeflateRect(1, 1);
// pDC->Draw3dRect(rect, GetSysColor(COLOR_3DFACE), GetSysColor(COLOR_3DSHADOW));
break;
default:break;
}
}
void CCoolTabCtrl::SetStyle(UINT style)
{
m_nStyle = style;
}
UINT CCoolTabCtrl::GetStyle()
{
return m_nStyle;
}
void CCoolTabCtrl::OnTimer(UINT nIDEvent)
{
static step,times = 10;
UINT width;
CRect rect;
GetClientRect(&rect);
rect.DeflateRect(m_nBorder+1,m_nBorder+1);
POSITION pos = m_PageList.FindIndex(m_nActivePage);
if(pos)
{
CPageItem *pItem = (CPageItem*)m_PageList.GetAt(pos);
if(pItem)
{
width = rect.Width();
if(times == 10)
{
rect.right = 10;
rect.left = rect.right - width + 1;
step = width/times;
times--;
m_bEraseBkgnd = FALSE;
pItem->m_pWnd->ShowWindow(SW_SHOW);
}
else
{
if(times <= 0)
{
times = 10;
KillTimer(nIDEvent);
m_bEraseBkgnd = TRUE;
}
else
{
rect.right = width - times*step;
rect.left = rect.right - width + 1;
times--;
}
}
pItem->m_pWnd->MoveWindow(rect);
}
}
}
void CCoolTabCtrl::SetStyleAnimate(BOOL bEnable)
{
UINT style = GetStyle();
if(bEnable)
style |= TCS_ANIMATE;
else
style &= ~TCS_ANIMATE;
SetStyle(style);
}
void CCoolTabCtrl::SetStyleDirection(int Direction)
{
UINT style = GetStyle();
int direction=Direction&(TCS_DOWNBEN|TCS_UPBEN|TCS_LEFTBEN|TCS_RIGHTBEN);
switch(Direction)
{
case TCS_DOWNBEN:
style &= ~TCS_UPBEN;
style &= ~TCS_LEFTBEN;
style &= ~TCS_RIGHTBEN;
style |= TCS_DOWNBEN;
break;
case TCS_UPBEN:
style &= ~TCS_DOWNBEN;
style &= ~TCS_LEFTBEN;
style &= ~TCS_RIGHTBEN;
style |= TCS_UPBEN;
break;
case TCS_LEFTBEN:
style &= ~TCS_UPBEN;
style &= ~TCS_DOWNBEN;
style &= ~TCS_RIGHTBEN;
style |= TCS_LEFTBEN;
break;
case TCS_RIGHTBEN:
style &= ~TCS_UPBEN;
style &= ~TCS_DOWNBEN;
style &= ~TCS_LEFTBEN;
style |= TCS_RIGHTBEN;
break;
default:
//style &= ~TCS_DOWN;
//style |= TCS_UP;
break;
}
SetStyle(style);
UpdateWindow();
}
void CCoolTabCtrl::SetStyleMonoSpace(BOOL bEnable)
{
UINT style = GetStyle();
if(bEnable)
style |= TCS_MONOSPACE;
else
style &= ~TCS_MONOSPACE;
SetStyle(style);
UpdateWindow();
}
void CCoolTabCtrl::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu menu;
VERIFY( menu.CreatePopupMenu() );
CString strNew;
GetText("ConMeuStyleDown",strNew,conmeu_item_text);
VERIFY( menu.AppendMenu( MF_BYCOMMAND | MF_STRING,
TCS_DOWNBEN, strNew) );
GetText("ConMeuStyleUp",strNew,conmeu_item_text);
VERIFY( menu.AppendMenu( MF_BYCOMMAND | MF_STRING,
TCS_UPBEN, strNew) );
GetText("ConMeuStyleLeft",strNew,conmeu_item_text);
VERIFY( menu.AppendMenu( MF_BYCOMMAND | MF_STRING,
TCS_LEFTBEN, strNew) );
GetText("ConMeuStyleRight",strNew,conmeu_item_text);
VERIFY( menu.AppendMenu( MF_BYCOMMAND | MF_STRING,
TCS_RIGHTBEN, strNew));
menu.CheckMenuItem(m_nStyle,MF_BYCOMMAND|MF_CHECKED);
UINT nID = menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON|TPM_RETURNCMD|TPM_NONOTIFY,
point.x, point.y,AfxGetApp()->m_pMainWnd);
SetStyleDirection(nID);
menu.DestroyMenu();
}
int CCoolTabCtrl::GetActivePage()
{
return m_nActivePage;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -