void STabCtrl::DrawItem(IRenderTarget *pRT,const CRect &rcItem,int iItem,DWORD dwState ) { if(rcItem.IsRectEmpty()) return; int iState = IIF_STATE3(dwState,WndState_Normal,WndState_Hover,WndState_PushDown); if(m_pSkinTab) m_pSkinTab->Draw(pRT,rcItem,iState); //根据状态从style中获得字体,颜色 IFontPtr font=m_style.GetTextFont(iState); COLORREF crTxt = m_style.GetTextColor(iState); CAutoRefPtr<IFont> oldFont; if(font) pRT->SelectObject(font,(IRenderObj**)&oldFont); COLORREF crOld = 0; if(crTxt != CR_INVALID) crOld = pRT->SetTextColor(crTxt); CRect rcIcon(m_ptIcon+rcItem.TopLeft(),CSize(0,0)); if(m_pSkinIcon) { rcIcon.right=rcIcon.left+m_pSkinIcon->GetSkinSize().cx; rcIcon.bottom=rcIcon.top+m_pSkinIcon->GetSkinSize().cy; int iIcon=GetItem(iItem)->GetIconIndex(); if(iIcon == -1) iIcon = iItem; m_pSkinIcon->Draw(pRT,rcIcon,iIcon); } if(m_ptText.x!=-1 && m_ptText.y!=-1) {//从指定位置开始绘制文字 pRT->TextOut(rcItem.left+m_ptText.x,rcItem.top+m_ptText.y,GetItem(iItem)->GetTitle(),-1); } else { CRect rcText=rcItem; UINT alignStyle=m_style.GetTextAlign(); UINT align=alignStyle; if(m_ptText.x==-1 && m_ptText.y!=-1) {//指定了Y偏移,X居中 rcText.top+=m_ptText.y; align=alignStyle&(DT_CENTER|DT_RIGHT|DT_SINGLELINE|DT_END_ELLIPSIS); } else if(m_ptText.x!=-1 && m_ptText.y==-1) {//指定了X偏移,Y居中 rcText.left+=m_ptText.x; align=alignStyle&(DT_VCENTER|DT_BOTTOM|DT_SINGLELINE|DT_END_ELLIPSIS); } pRT->DrawText(GetItem(iItem)->GetTitle(),-1,&rcText,align); } //恢复字体,颜色 if(font) pRT->SelectObject(oldFont); if(crTxt!=CR_INVALID) pRT->SetTextColor(crOld); }
void SComboBase::OnPaint(IRenderTarget * pRT ) { SPainter painter; BeforePaint(pRT, painter); if(GetCurSel() != -1 && m_pEdit==NULL) { CRect rcText; GetTextRect(rcText); SStringT strText=GetWindowText(); DrawText(pRT,strText, strText.GetLength(), rcText, GetTextAlign()); } //draw focus rect if(IsFocused()) { DrawFocus(pRT); } AfterPaint(pRT, painter); CRect rcBtn; GetDropBtnRect(&rcBtn); m_pSkinBtn->Draw(pRT,rcBtn,IIF_STATE3(m_dwBtnState,WndState_Normal,WndState_Hover,WndState_PushDown)); }