⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cooltabctrl.cpp

📁 一个多窗口的浏览器的程序benbrowse
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			{
				::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 + -