📄 xguitabwnd.cpp
字号:
{
m_iSizeAct=(m_rectCliente.Width()-12)/m_Numtabs;
for (int iCont=0; iCont< m_Numtabs;iCont++)
{
CGuiTab* ct=(CGuiTab*) m_pArray[iCont];
CRect m_Arect;
m_Arect.left=m_NewResize;
m_Arect.right=m_NewResize+m_iSizeAct;
m_Arect.top=m_rectCliente.bottom;
m_Arect.bottom=m_rectCliente.bottom+4+m_sizeImag.cy;
m_NewResize+=m_iSizeAct+1;
ct->rect= m_Arect;
}
}
}
}
void CGuiTabWnd::Drawtabs(CDC* dc)
{
CPen light(PS_SOLID,1,GetSysColor(COLOR_BTNHIGHLIGHT));
CPen Dark(PS_SOLID,1,GetSysColor(COLOR_BTNSHADOW));
CPen Black(PS_SOLID,1,GetSysColor(BLACK_PEN));
CRect rectText;
CFont* m_fontOld = dc->SelectObject(&m_cfont);
for (int iCont=0; iCont< m_Numtabs;iCont++)
{
CGuiTab* ct=(CGuiTab*) m_pArray[iCont];
CPen* oldPen= dc->SelectObject(&light);
//si es la carpeta seleccionada, se debe
//eliminar las lineas oscuras de encima
if (iCont ==m_iSelectTab)
{
CBrush cbr;
CRect m_rectTabAux=ct->rect;
m_rectTabAux.DeflateRect(1,1);
m_rectTabAux.top-=4;
m_rectTabAux.bottom=m_rectTabAux.top+4;
cbr.CreateSysColorBrush(COLOR_BTNFACE);
dc->FillRect(ct->rect,&cbr);
dc->MoveTo(ct->rect.left,ct->rect.top-3);
dc->LineTo(ct->rect.left,ct->rect.bottom-1);
dc->FillRect(m_rectTabAux,&cbr);
dc->SelectStockObject(BLACK_PEN);
dc->MoveTo(ct->rect.left,ct->rect.bottom-1);
dc->LineTo(ct->rect.right,ct->rect.bottom-1);
//linea derecha observe que se pinta dos veces para
//dar el efecto de redondeada en la puntas
dc->SelectStockObject(BLACK_PEN);
dc->MoveTo(ct->rect.right-1,ct->rect.top-1);
dc->LineTo(ct->rect.right-1,ct->rect.bottom-1);
}
else
{
if ((iCont+1) != m_iSelectTab)
{
dc->SelectObject(&Dark);
dc->MoveTo(ct->rect.right-1,ct->rect.top+2);
dc->LineTo(ct->rect.right-1,ct->rect.bottom-2);
}
}
//se dibuja el icono
int nMode = dc->SetBkMode(TRANSPARENT);
CSize m_sChar=dc->GetTextExtent(ct->lpMsg,strlen(ct->lpMsg));
if (m_sizeImag.cx+m_sChar.cx < ct->rect.Width()-8)
{
m_pImage->Draw(dc,ct->uIcon,CPoint(ct->rect.left+2,ct->rect.top+2),ILD_TRANSPARENT);
rectText=ct->rect;
rectText.left+=m_sizeImag.cx+8;
rectText.right-=2;
dc->DrawText(ct->lpMsg,rectText,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
CToolTip.SetToolRect(this,iCont+1,CRect(0,0,0,0));
}
else
{
//verificamos si se puede poner algun texto o
//por lo memos el icono
if (m_sizeImag.cx < ct->rect.Width())
{
m_pImage->Draw(dc,ct->uIcon,CPoint(ct->rect.left+2,ct->rect.top+2),ILD_TRANSPARENT);
rectText=ct->rect;
rectText.left+=m_sizeImag.cx+8;
rectText.right-=5;
CString m_cadBreak=ct->lpMsg;
int c=0;
int cont=m_cadBreak.GetLength();
while(cont > 1 )
{
CString m_scadtemp=m_cadBreak+"...";
CSize coor=dc->GetTextExtent(m_scadtemp,m_scadtemp.GetLength());
if(coor.cx > rectText.Width())
m_cadBreak=m_cadBreak.Left(m_cadBreak.GetLength()-1);
else
break;
cont--;
}
m_cadBreak+=_T("...");
rectText.right+=3;
dc->DrawText(m_cadBreak,rectText,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
CToolTip.SetToolRect(this,iCont+1,&ct->rect);
}
}
dc->SelectObject(oldPen);
dc->SetBkMode(nMode);
}
dc->SelectObject(&m_fontOld);
}
void CGuiTabWnd::SetImageList(UINT nBitmapID, int cx, int nGrow, COLORREF crMask)
{
CBitmap cbmp;
BITMAP bmp;
CImageList Image;
Image.Create(nBitmapID,cx,nGrow,crMask);
m_pImage = &Image;
cbmp.LoadBitmap(nBitmapID);
cbmp.GetBitmap(&bmp);
m_pImage->Add(&cbmp,crMask);
m_sizeImag=CSize(cx,bmp.bmHeight);
}
CWnd* CGuiTabWnd::GetActiveWnd () const
{
return m_Numtabs == -1 ? NULL :
((CGuiTab*) m_pArray [m_Numtabs])->pParent;
}
BOOL CGuiTabWnd::FindItem(HWND hWnd)
{
for (int iCont=0; iCont< m_Numtabs;iCont++)
{
CGuiTab* ct=(CGuiTab*) m_pArray[iCont];
if (ct->pParent->GetSafeHwnd() == hWnd)
return TRUE;
}
return FALSE;
}
CWnd* CGuiTabWnd::GetNumWnd(int m_numtab) const
{
if (m_numtab > m_Numtabs)
return NULL;
else
{
if (m_pArray.GetSize() < 1) return NULL;
CWnd* pw=((CGuiTab*) m_pArray [m_numtab])->pParent;
if (HIWORD(pw)== NULL) return NULL;
else
return ((CGuiTab*) m_pArray [m_numtab])->pParent;
}
}
void CGuiTabWnd::UpdateCaption(CWnd* pWnd,CString m_Title)
{
for (int iCont=0; iCont< m_Numtabs;iCont++)
{
CGuiTab* ct=(CGuiTab*) m_pArray[iCont];
if (ct->pParent->GetSafeHwnd() == pWnd->GetSafeHwnd())
{
CString x=ct->lpMsg;
if(x!=m_Title)
{
ct->lpMsg=m_Title;
GetParentFrame()->SendMessage(WM_SIZE);
RecalLayout();
Invalidate();
UpdateWindow();
}
break;
}
}
}
void CGuiTabWnd::ShowTitle(CString m_Caption)
{
if (m_ActualTitle==TRUE)
{
CWnd* pParent=GetParent();
pParent->SetWindowText(m_Caption);
pParent->SendMessage(WM_COMMAND,WM_SHOWTITLE);
}
}
void CGuiTabWnd::Addtab(CWnd *pParent, CString lpMsg, UINT uIcon)
{
ASSERT_VALID(pParent);
m_pArray.SetAtGrow(m_Numtabs,new CGuiTab(pParent,lpMsg,uIcon));
if (m_Numtabs==0)
{
// ShowTitle(lpMsg);
pParent->ShowWindow(SW_SHOW);
m_iSelectTab=m_Numtabs;
}
else
pParent->ShowWindow(SW_HIDE);
m_Numtabs++;
if (m_alnTab==ALN_TOP)
pParent->ShowWindow(SW_SHOWMAXIMIZED);
if (m_style == S3D)
CToolTip.AddTool(this,lpMsg,CRect(0,0,0,0),m_Numtabs);
RecalLayout();
}
void CGuiTabWnd::DeleteTab(int m_numtab)
{
if (m_numtab < m_Numtabs)
{
CGuiTab* ctn=(CGuiTab*) m_pArray[m_numtab];
CWnd* pParen=ctn->pParent;
if (m_alnTab!=ALN_TOP)
ASSERT_VALID(pParen);
m_Numtabs--;
m_pArray.RemoveAt(m_numtab,1);
if (m_Numtabs >0)
{
if (m_iSelectTab == m_numtab)
{
m_iSelectTab=0;
CGuiTab* ctn =(CGuiTab*) m_pArray[m_iSelectTab];
CWnd* pParentNew=ctn->pParent;
ASSERT_VALID(pParentNew);
pParentNew->ShowWindow(SW_SHOW);
}
RecalLayout();
}
}
}
void CGuiTabWnd::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
if (m_Numtabs > 0)
RecalLayout();
}
void CGuiTabWnd::SetCurtab(int m_numtab)
{
if (m_numtab < m_Numtabs && m_numtab != m_iSelectTab )
{
CGuiTab* ctn=(CGuiTab*) m_pArray[m_numtab];
CWnd* pParentNew= ctn->pParent;
CGuiTab* ct =(CGuiTab*) m_pArray[m_iSelectTab];
CWnd* pParentActual=ct->pParent;
ASSERT_VALID(pParentNew);
ASSERT_VALID(pParentActual);
if (m_alnTab==ALN_TOP)
{
pParentNew->BringWindowToTop();
}
else
{
pParentActual->ShowWindow(SW_HIDE);
pParentNew->ShowWindow(SW_SHOW);
}
m_iSelectTab=m_numtab;
Invalidate();
UpdateWindow();
}
}
int CGuiTabWnd::GetCurtab()
{
return m_iSelectTab;
}
void CGuiTabWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWnd::OnLButtonDown(nFlags, point);
for (int iCont=0; iCont< m_Numtabs;iCont++)
{
CGuiTab* ct=(CGuiTab*) m_pArray[iCont];
if (ct->rect.PtInRect(point) != 0)
{
SetCurtab(iCont);
ShowTitle(ct->lpMsg);
return;
}
}
}
void CGuiTabWnd::SetStyle(Style estyle)
{
m_style=estyle;
}
int CGuiTabWnd::HitTest(CPoint pt)
{
for (int iCont=0; iCont< m_Numtabs;iCont++)
{
CGuiTab* ct=(CGuiTab*) m_pArray[iCont];
if (ct->rect.PtInRect(pt) != 0)
return iCont;
}return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -