void CCheckButton::DrawControl(CDC &dc, CRect rcUpdate) { int nWidth = m_rc.Width(); int nHeight = m_rc.Height(); if(!m_bUpdate) { UpdateMemDC(dc, nWidth * 6, nHeight); Graphics graphics(m_memDC); CRect rcTemp(0, 0, nWidth, nHeight); for(int i = 0; i < 6; i++) { m_memDC.BitBlt(i * nWidth, 0, nWidth, nHeight, &dc, m_rc.left ,m_rc.top, SRCCOPY); graphics.DrawImage(m_pImage, Rect(rcTemp.left, rcTemp.top + (nHeight - m_sizeImage.cy) / 2, m_sizeImage.cx, m_sizeImage.cy), i * m_sizeImage.cx, 0, m_sizeImage.cx, m_sizeImage.cy, UnitPixel); rcTemp.OffsetRect(nWidth, 0); } if(!m_strTitle.IsEmpty()) { m_memDC.SetBkMode(TRANSPARENT); rcTemp.SetRect(0, 0, nWidth, nHeight); FontFamily fontFamily(m_strFont.AllocSysString()); Font font(&fontFamily, (REAL)m_nFontWidth, m_fontStyle, UnitPixel); graphics.SetTextRenderingHint( TextRenderingHintClearTypeGridFit ); StringFormat strFormat; strFormat.SetAlignment(StringAlignmentNear); strFormat.SetFormatFlags( StringFormatFlagsNoWrap | StringFormatFlagsMeasureTrailingSpaces); Size size = GetTextBounds(font, strFormat, m_strTitle); CPoint point = GetOriginPoint(nWidth - m_sizeImage.cx - 3, nHeight, size.Width, size.Height, m_uAlignment, m_uVAlignment); for(int i = 0; i < 6; i++) { SolidBrush solidBrush(enBSDisable == i ? Color(128, 128, 128) : m_clrText); RectF rect(m_sizeImage.cx + 3 + point.x + i * nWidth, point.y, nWidth - m_sizeImage.cx - 3 - point.x, size.Height); graphics.DrawString(m_strTitle.AllocSysString(), (INT)wcslen(m_strTitle.AllocSysString()), &font, rect, &strFormat, &solidBrush); // 画焦点框(虚线框) if(m_bIsFocus) { Pen pen(Color(128, 128, 128), 1); pen.SetDashStyle(DashStyleDot); RectF rectFocus(point.x + i * nWidth, point.y, m_sizeImage.cx + 6 + size.Width, size.Height); graphics.DrawRectangle(&pen, rectFocus); } } } } dc.BitBlt(m_rc.left,m_rc.top, m_rc.Width(), m_rc.Height(), &m_memDC, m_enButtonState * nWidth, 0, SRCCOPY); }
//绘画扑克 VOID CCardControl::DrawCardControl(CDC * pDC) { //加载位图 CImageHandle HandleCard(&m_ImageCard); //获取位置 CPoint OriginPoint; GetOriginPoint(OriginPoint); //绘画扑克 INT nXImagePos=0,nYImagePos=0; BYTE cbCardData = 0; if( !m_bMoving || m_nXDistance > 0 ) { for (WORD i=0;i<m_wCardCount;i++) { //变量定义 cbCardData=m_CardItem[i].cbCardData; //图片位置 if ( m_CardItem[i].bDisplay && cbCardData != 0 && cbCardData != 0xFF ) { nXImagePos=((cbCardData&CARD_MASK_VALUE)-1)*m_CardSize.cx; nYImagePos=((cbCardData&CARD_MASK_COLOR)>>4)*m_CardSize.cy; } else { nXImagePos=m_CardSize.cx*2; nYImagePos=m_CardSize.cy*4; } //绘画扑克 m_ImageCard.AlphaDrawImage(pDC,OriginPoint.x+m_nXDistance*i,OriginPoint.y,m_CardSize.cx,m_CardSize.cy,nXImagePos,nYImagePos,RGB(255,0,255)); }
void CDuiAnimateImage::DrawControl(CDC &dc, CRect rcUpdate) { int nWidth = m_rc.Width(); int nHeight = m_rc.Height(); if(!m_bUpdate) { UpdateMemDC(dc, nWidth * m_nMaxIndex, nHeight); Graphics graphics(m_memDC); CPoint point = GetOriginPoint(nWidth, nHeight, m_sizeImage.cx, m_sizeImage.cy, GetGDIAlignment(m_uAlignment), GetGDIVAlignment(m_uVAlignment)); for(int i = 0; i < m_nMaxIndex; i++) { m_memDC.BitBlt(i * nWidth, 0, nWidth, nHeight, &dc, m_rc.left ,m_rc.top, SRCCOPY); graphics.DrawImage(m_pImage, Rect(point.x , point.y, m_sizeImage.cx, m_sizeImage.cy), i * m_sizeImage.cx, 0, m_sizeImage.cx, m_sizeImage.cy, UnitPixel); point.x += nWidth; } } dc.BitBlt(m_rc.left,m_rc.top, m_rc.Width(), m_rc.Height(), &m_memDC, m_nIndex * nWidth, 0, SRCCOPY); }
void CHideButton::DrawControl(CDC &dc, CRect rcUpdate) { int nWidth = m_rc.Width(); int nHeight = m_rc.Height(); if(!m_bUpdate) { UpdateMemDC(dc, nWidth * 5, nHeight); for(int i = 0; i < 4; i++) { m_memDC.BitBlt(i * nWidth, 0, nWidth, nHeight, &dc, m_rc.left ,m_rc.top, SRCCOPY); } Color clrText[4] = {m_clrTextNormal, m_clrTextHover, m_clrTextDown, m_clrTextDisable}; Graphics graphics(m_memDC); FontFamily fontFamily(m_strFont.AllocSysString()); Font font(&fontFamily, (REAL)m_nFontWidth, m_fontStyle, UnitPixel); graphics.SetTextRenderingHint( TextRenderingHintClearTypeGridFit ); // 设置水平和垂直对齐方式 DUI_STRING_ALIGN_DEFINE(); strFormat.SetFormatFlags( StringFormatFlagsNoWrap | StringFormatFlagsMeasureTrailingSpaces); Size sizeTip = GetTextBounds(font, strFormat, m_strTip); Size sizeText = GetTextBounds(font, strFormat, m_strTitle); CPoint point = GetOriginPoint(nWidth, nHeight, sizeText.Width, sizeText.Height, m_uAlignment, m_uVAlignment); m_rcText.SetRect(m_rc.left + sizeTip.Width + 10, m_rc.top + point.y, m_rc.left + sizeTip.Width + 10 + sizeText.Width, m_rc.top + point.y + sizeText.Height); SolidBrush solidBrushTip(m_clrTip); for(int i = 0; i < 4; i++) { RectF rect(i * nWidth, point.y, sizeTip.Width + 10, sizeTip.Height); graphics.DrawString(m_strTip.AllocSysString(), (INT)wcslen(m_strTip.AllocSysString()), &font, rect, &strFormat, &solidBrushTip); if(i > 0) { SolidBrush solidBrush(clrText[i - 1]); RectF rect(sizeTip.Width + 10 + i * nWidth, point.y, nWidth - (sizeTip.Width + 10), sizeText.Height); graphics.DrawString(m_strTitle.AllocSysString(), (INT)wcslen(m_strTitle.AllocSysString()), &font, rect, &strFormat, &solidBrush); } } } dc.BitBlt(m_rc.left,m_rc.top, m_rc.Width(), m_rc.Height(), &m_memDC, m_bShowButton ? (1 + m_enButtonState) * nWidth : 0, 0, SRCCOPY); }
//基准位置 VOID CCardControl::SetBenchmarkPos(const CPoint & BenchmarkPos, enXCollocateMode XCollocateMode, enYCollocateMode YCollocateMode) { //设置变量 m_BenchmarkPos=BenchmarkPos; m_XCollocateMode=XCollocateMode; m_YCollocateMode=YCollocateMode; CPoint ptt; GetOriginPoint(ptt); ptt.x+=10; ptt.y+=23; m_SecondCardRect.SetRect(ptt.x,ptt.y,ptt.x+80,ptt.y+105); return; }
//获取中心 VOID CCardControl::GetCenterPoint(CPoint & CenterPoint) { //获取原点 CPoint OriginPoint; GetOriginPoint(OriginPoint); //获取位置 CSize ControlSize; GetControlSize(ControlSize); //设置中心 CenterPoint.x=OriginPoint.x+ControlSize.cx/2; CenterPoint.y=OriginPoint.y+ControlSize.cy/2; return; }
//绘画扑克 VOID CCardControl::DrawCardControl(CDC * pDC) { //显示判断 if (m_bShowCardControl==false) return; //加载位图 CPngImage ImageCardMask; CImageHandle HandleCard(&m_ImageCard); //获取位置 CPoint OriginPoint; GetOriginPoint(OriginPoint); //变量定义 INT nXDrawPos=0,nYDrawPos=0; INT nXImagePos=0,nYImagePos=0; //加载资源 //CPngImage ImageCardSelect; //if ((m_wStartIndex<m_wCardCount)&&(m_wEndIndex<m_wCardCount)) //{ // ImageCardSelect.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_SELECT")); //} for (WORD i=0;i<m_wCardCount;i++) { //获取扑克 BYTE cbCardData=m_CardItemArray1[i].cbCardData; //间隙过滤 //if (cbCardData==SPACE_CARD_DATA) continue; if(!cbCardData)continue; //图片位置 if (cbCardData!=0) { if ((cbCardData==0x4E)||(cbCardData==0x4F)) { nXImagePos=((cbCardData&CARD_MASK_VALUE)%14)*m_CardSize.cx; nYImagePos=((cbCardData&CARD_MASK_COLOR)>>4)*m_CardSize.cy; } else { nXImagePos=((cbCardData&CARD_MASK_VALUE)-1)*m_CardSize.cx; nYImagePos=((cbCardData&CARD_MASK_COLOR)>>4)*m_CardSize.cy; } }
//绘画扑克 VOID CCardControl::DrawCardControl(CDC * pDC) { //加载位图 CPngImage ImageCardMask; CImageHandle HandleCard(&m_ImageCard); //获取位置 CPoint OriginPoint; GetOriginPoint(OriginPoint); //变量定义 INT nXDrawPos=0,nYDrawPos=0; INT nXImagePos=0,nYImagePos=0; //加载资源 CPngImage ImageCardSelect; if ((m_wStartIndex<m_wCardCount)&&(m_wEndIndex<m_wCardCount)) { ImageCardSelect.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_SELECT")); } //绘画扑克 for (WORD i=0;i<m_wCardCount;i++) { //获取扑克 bool bShoot=m_CardItemArray[i].bShoot; BYTE cbCardData=m_CardItemArray[i].cbCardData; //间隙过滤 if (cbCardData==SPACE_CARD_DATA) continue; //图片位置 if ((m_bDisplayItem==true)&&(cbCardData!=0)) { if ((cbCardData==0x4E)||(cbCardData==0x4F)) { nXImagePos=((cbCardData&CARD_MASK_VALUE)%14)*m_CardSize.cx; nYImagePos=((cbCardData&CARD_MASK_COLOR)>>4)*m_CardSize.cy; } else { nXImagePos=((cbCardData&CARD_MASK_VALUE)-1)*m_CardSize.cx; nYImagePos=((cbCardData&CARD_MASK_COLOR)>>4)*m_CardSize.cy; } }
void CLinkButton::DrawControl(CDC &dc, CRect rcUpdate) { int nWidth = m_rc.Width(); int nHeight = m_rc.Height(); if(!m_bUpdate) { UpdateMemDC(dc, nWidth * 4, nHeight); for(int i = 0; i < 4; i++) { m_memDC.BitBlt(i * nWidth, 0, nWidth, nHeight, &dc, m_rc.left ,m_rc.top, SRCCOPY); } Color clrText[4] = {m_clrTextNormal, m_clrTextHover, m_clrTextDown, m_clrTextDisable}; Graphics graphics(m_memDC); BSTR bsFont = m_strFont.AllocSysString(); FontFamily fontFamily(bsFont); Font font(&fontFamily, (REAL)m_nFontWidth, m_fontStyle, UnitPixel); graphics.SetTextRenderingHint( TextRenderingHintClearTypeGridFit ); ::SysFreeString(bsFont); StringFormat strFormat; strFormat.SetAlignment(StringAlignmentNear); strFormat.SetFormatFlags( StringFormatFlagsNoWrap | StringFormatFlagsMeasureTrailingSpaces); Size sizeText = GetTextBounds(font, strFormat, m_strTitle); CPoint point = GetOriginPoint(nWidth, nHeight, sizeText.Width, sizeText.Height, GetGDIAlignment(m_uAlignment), GetGDIVAlignment(m_uVAlignment)); m_rcText.SetRect(m_rc.left, m_rc.top + point.y, m_rc.left + sizeText.Width, m_rc.top + point.y + sizeText.Height); for(int i = 0; i < 4; i++) { SolidBrush solidBrush(clrText[i]); RectF rect((Gdiplus::REAL)(i * nWidth), (Gdiplus::REAL)point.y, (Gdiplus::REAL)nWidth, (Gdiplus::REAL)sizeText.Height); BSTR bsTitle = m_strTitle.AllocSysString(); graphics.DrawString(bsTitle, (INT)wcslen(bsTitle), &font, rect, &strFormat, &solidBrush); ::SysFreeString(bsTitle); } } dc.BitBlt(m_rc.left,m_rc.top, m_rc.Width(), m_rc.Height(), &m_memDC, m_enButtonState * nWidth, 0, SRCCOPY); }
void CMenuItem::DrawControl(CDC &dc, CRect rcUpdate) { int nWidth = m_rc.Width(); int nHeight = m_rc.Height(); if(!m_bUpdate) { int nImageCount = m_bSelect ? 6 : 4; if(m_nImagePicCount != 4) { // 如果修改过img-count属性,则用此属性设置的图片个数 nImageCount = m_nImagePicCount; } if(m_bIsSeparator) { nImageCount = 1; } UpdateMemDC(dc, nWidth * nImageCount, nHeight); // 刷新图片的大小(因为m_bSelect选项有可能在SetBitmap之后有变化) if(m_pImage != NULL) { if(m_bIsPopup && (m_pImagePopupArrow == NULL)) { m_sizeImage.SetSize(m_pImage->GetWidth() / 2, m_pImage->GetHeight()); }else { m_sizeImage.SetSize(m_pImage->GetWidth() / nImageCount, m_pImage->GetHeight()); } } Graphics graphics(m_memDC); CRect rcTemp(0, 0, nWidth, nHeight); for(int i = 0; i < nImageCount; i++) { m_memDC.BitBlt(i * nWidth, 0, nWidth, nHeight, &dc, m_rc.left ,m_rc.top, SRCCOPY); if(enBSHover == i || (enBSDown == i && !m_bSelect) || enBSHoverDown == i) { // 画菜单项背景 if(m_pImageHover != NULL) { // 使用拉伸模式属性画图 graphics.DrawImage(m_pImageHover, RectF((Gdiplus::REAL)(i * nWidth+m_nFrameWidth), 0, (Gdiplus::REAL)(nWidth-m_nFrameWidth*2), (Gdiplus::REAL)nHeight), 0, 0, (Gdiplus::REAL)m_sizeHover.cx, (Gdiplus::REAL)m_sizeHover.cy, UnitPixel); }else { // 使用颜色填充 SolidBrush brush(m_clrHover);//Color(254, 71, 156, 235)); graphics.FillRectangle(&brush, i * nWidth+m_nFrameWidth, 0, nWidth-m_nFrameWidth*2, nHeight); } } if(m_pImage != NULL) { if(m_bIsSeparator) { // 如果是分隔线,则采用平铺方式画图 TextureBrush tileBrush(m_pImage, WrapModeTile); graphics.FillRectangle(&tileBrush, RectF((Gdiplus::REAL)rcTemp.left, (Gdiplus::REAL)(rcTemp.top + (nHeight - m_sizeImage.cy) / 2), (Gdiplus::REAL)(nWidth-m_nFrameWidth*2), (Gdiplus::REAL)m_sizeImage.cy)); }else if(m_bIsPopup && (m_pImagePopupArrow == NULL)) { // 如果是弹出菜单,并且没有设置菜单的箭头图片,则用菜单图片作为右侧的箭头图片 graphics.DrawImage(m_pImage, Rect(rcTemp.right - m_sizeImage.cx - 6, rcTemp.top + (nHeight - m_sizeImage.cy) / 2, m_sizeImage.cx, m_sizeImage.cy), (i % 2) * m_sizeImage.cx, 0, m_sizeImage.cx, m_sizeImage.cy, UnitPixel); }else { // 普通菜单项的图片 graphics.DrawImage(m_pImage, Rect(rcTemp.left + (m_nLeft - m_sizeImage.cx) / 2, rcTemp.top + (nHeight - m_sizeImage.cy) / 2, m_sizeImage.cx, m_sizeImage.cy), i * m_sizeImage.cx, 0, m_sizeImage.cx, m_sizeImage.cy, UnitPixel); } } // 如果是弹出菜单,并且设置了菜单的箭头图片,则画右侧的箭头图片 if(m_bIsPopup && (m_pImagePopupArrow != NULL)) { graphics.DrawImage(m_pImagePopupArrow, Rect(rcTemp.right - m_sizePopupArrow.cx - 6, rcTemp.top + (nHeight - m_sizePopupArrow.cy) / 2, m_sizePopupArrow.cx, m_sizePopupArrow.cy), (i % 2) * m_sizePopupArrow.cx, 0, m_sizePopupArrow.cx, m_sizePopupArrow.cy, UnitPixel); } rcTemp.OffsetRect(nWidth, 0); } if(!m_strTitle.IsEmpty()) { m_memDC.SetBkMode(TRANSPARENT); rcTemp.SetRect(0, 0, nWidth, nHeight); BSTR bsFont = m_strFont.AllocSysString(); FontFamily fontFamily(bsFont); Font font(&fontFamily, (REAL)m_nFontWidth, m_fontStyle, UnitPixel); graphics.SetTextRenderingHint( TextRenderingHintClearTypeGridFit ); ::SysFreeString(bsFont); StringFormat strFormat; strFormat.SetAlignment(StringAlignmentNear); strFormat.SetFormatFlags( StringFormatFlagsNoWrap | StringFormatFlagsMeasureTrailingSpaces); Size size = GetTextBounds(font, strFormat, m_strTitle); CPoint point = GetOriginPoint(nWidth - m_nLeft, nHeight, size.Width, size.Height, m_uAlignment, m_uVAlignment); for(int i = 0; i < nImageCount; i++) { SolidBrush solidBrush(enBSDisable == i ? Color(254, 128, 128, 128) : (enBSHover == i || (enBSDown == i && !m_bSelect) || enBSHoverDown == i ? Color(254, 255, 255, 255) : Color(254, 56, 56, 56))); RectF rect((Gdiplus::REAL)(m_nLeft + point.x + i * nWidth), (Gdiplus::REAL)point.y, (Gdiplus::REAL)(nWidth - (m_nLeft + point.x)), (Gdiplus::REAL)size.Height); BSTR bsTitle = m_strTitle.AllocSysString(); graphics.DrawString(bsTitle, (INT)wcslen(bsTitle), &font, rect, &strFormat, &solidBrush); ::SysFreeString(bsTitle); } } } dc.BitBlt(m_rc.left,m_rc.top, m_rc.Width(), m_rc.Height(), &m_memDC, m_enButtonState * nWidth, 0, SRCCOPY); }
// 画控件 void CDuiTabCtrl::DrawControl(CDC &dc, CRect rcUpdate) { int nWidth = m_rc.Width(); //int nHeight = m_rc.Height(); // 纵向内存DC的高度是整个tabctrl的高度,不只是页签部分高度 int nTabHeight = m_nTabCtrlHeight; // 纵向内存DC高度改为tabctrl部分高度 if(!m_bUpdate) { // 创建内存DC,纵向分为6层: // 1.tab页签图片-原图 // 2.tab页签图片-鼠标热点 // 3.tab页签图片-鼠标按下 // 4,5,6层是上面3层的备份 UpdateMemDC(dc, nWidth, nTabHeight * 3 * 2); Graphics graphics(m_memDC); BSTR bsFont = m_strFont.AllocSysString(); FontFamily fontFamily(bsFont); Font font(&fontFamily, (REAL)m_nFontWidth, m_fontStyle, UnitPixel); ::SysFreeString(bsFont); //SolidBrush solidBrush(m_clrText); // 正常文字画刷 graphics.SetTextRenderingHint( TextRenderingHintClearTypeGridFit ); // 设置tab页签文字的水平和垂直对齐方式 DUI_STRING_ALIGN_DEFINE(); strFormat.SetFormatFlags( StringFormatFlagsNoWrap | StringFormatFlagsMeasureTrailingSpaces); // 画内存DC的3个层的内容 for(int i = 0; i < 3; i++) { // 将背景内容拷贝到内存DC m_memDC.BitBlt(0, i * nTabHeight, nWidth, nTabHeight, &dc, m_rc.left, m_rc.top, SRCCOPY); // 画tab页签 int nXPos = m_nTabLeftPading; int nYPos = i * nTabHeight; for(size_t j = 0; j < m_vecItemInfo.size(); j++) { TabItemInfo &itemInfo = m_vecItemInfo.at(j); if(!itemInfo.bVisible) { continue; } // 图片位置(根据对齐方式进行计算) CPoint point = GetOriginPoint(m_nTabItemWidth, m_nTabCtrlHeight, itemInfo.sizeImage.cx, itemInfo.sizeImage.cy, GetGDIAlignment(m_uAlignment), GetGDIVAlignment(m_uVAlignment)); // 如果有图片和文字,则图片的垂直对齐按照上对齐方式 if(!itemInfo.strText.IsEmpty()) { point.y = 0; } // 画tab页签底图 if(itemInfo.pImage != NULL) // 如果页签设置了图片,则使用tab页签指定的图片 { int nImageIndex = i; if(itemInfo.nImageCount == 1) { nImageIndex = 0; } graphics.DrawImage(itemInfo.pImage, Rect(nXPos + point.x, nYPos + point.y, itemInfo.sizeImage.cx, itemInfo.sizeImage.cy), itemInfo.sizeImage.cx * nImageIndex, 0, itemInfo.sizeImage.cx, itemInfo.sizeImage.cy, UnitPixel); }else if((m_pImage != NULL) && (itemInfo.nImageIndex != -1)) // 如果设置了页签图片索引,使用tabctrl图片的索引图片 { if(m_enTabImageMode == enTIMNormal) // 普通模式 { graphics.DrawImage(m_pImage, Rect(nXPos + point.x, nYPos + point.y, itemInfo.sizeImage.cx, itemInfo.sizeImage.cy), itemInfo.sizeImage.cx * itemInfo.nImageIndex, 0, itemInfo.sizeImage.cx, itemInfo.sizeImage.cy, UnitPixel); }else if(m_enTabImageMode == enTIMMID) // 九宫格模式 { CRect rcTemp(nXPos, nYPos, nXPos+m_nTabItemWidth, nYPos+m_nTabCtrlHeight); DrawImageFrameMID(graphics, m_pImage, rcTemp, m_sizeImage.cx * i, 0, m_sizeImage.cx, m_sizeImage.cy, m_nWLT, m_nHLT, m_nWRB, m_nHRB); } } // 画tab页签热点图(如果存在tabctrl设置的热点图的话) if((m_pImageHover != NULL) && (i > 0)) { int nX = (itemInfo.rc.Width() - m_sizeHover.cx) / 2; if(nX < 0) { nX = 0; } graphics.DrawImage(m_pImageHover, Rect(nXPos + nX, nYPos, m_sizeHover.cx, m_sizeHover.cy), m_sizeHover.cx * (i-1), 0, m_sizeHover.cx, m_sizeHover.cy, UnitPixel); } // 画tab页签文字 if(!itemInfo.strText.IsEmpty()) { // 设置页签文字颜色 SolidBrush solidBrushItem(m_clrText); if((m_nHoverItem == j) && (m_clrTextHover.GetValue() != Color(0, 0, 0, 0).GetValue())) // 设置了鼠标移动颜色,则使用 { solidBrushItem.SetColor(m_clrTextHover); }else if((m_nDownItem == j) && (m_clrTextDown.GetValue() != Color(0, 0, 0, 0).GetValue())) // 设置了鼠标按下颜色,则使用 { solidBrushItem.SetColor(m_clrTextDown); } RectF rectText((Gdiplus::REAL)nXPos, (Gdiplus::REAL)(nYPos + itemInfo.sizeImage.cy + 1), (Gdiplus::REAL)((m_pImageTabBtn != NULL) ? (itemInfo.rc.Width()-m_sizeTabBtn.cx) : itemInfo.rc.Width()), (Gdiplus::REAL)(m_nTabCtrlHeight - itemInfo.sizeImage.cy - 1)); if(m_nTabCtrlHeight <= itemInfo.sizeImage.cy) { // 如果tabctrl高度小于图片高度,则文字直接居中显示 rectText.Y = (Gdiplus::REAL)nYPos; rectText.Height = (Gdiplus::REAL)m_nTabCtrlHeight; } // 计算是否需要显示tip itemInfo.bNeedTextTip = rectText.Width < GetTextBounds(font, itemInfo.strText).Width; BSTR bsText = itemInfo.strText.AllocSysString(); graphics.DrawString(bsText, (INT)wcslen(bsText), &font, rectText, &strFormat, &solidBrushItem); ::SysFreeString(bsText); } nXPos += itemInfo.rc.Width(); // 画tab页签之间的分隔图片(采用拉伸方式) if(j < m_vecItemInfo.size() - 1 && m_pImageSeperator != NULL) { CRect &rc = m_vecRcSeperator.at(j); int nSepHeight = itemInfo.rc.Height(); // m_sizeSeperator.cy graphics.DrawImage(m_pImageSeperator, Rect(nXPos, nYPos, m_sizeSeperator.cx, nSepHeight), 0, 0, m_sizeSeperator.cx, m_sizeSeperator.cy, UnitPixel); nXPos += m_sizeSeperator.cx; } } } // 内存dc复制一份进行备份 m_memDC.BitBlt(0, nTabHeight * 3, nWidth, nTabHeight * 3, &m_memDC, 0, 0, SRCCOPY); } // 画Tab页签按钮到内存dc if(m_pImageTabBtn != NULL) { // 现将备份的内存dc整体进行恢复,避免页签按钮叠加之后的影响 m_memDC.BitBlt(0, 0, nWidth, nTabHeight * 3, &m_memDC, 0, nTabHeight * 3, SRCCOPY); Graphics graphics(m_memDC); for(int i = 0; i < 3; i++) { for(size_t j = 0; j < m_vecItemInfo.size(); j++) { TabItemInfo &itemInfo = m_vecItemInfo.at(j); graphics.DrawImage(m_pImageTabBtn, RectF((Gdiplus::REAL)itemInfo.rcButton.left, (Gdiplus::REAL)(nTabHeight * i + itemInfo.rcButton.top), (Gdiplus::REAL)itemInfo.rcButton.Width(), (Gdiplus::REAL)itemInfo.rcButton.Height()), (Gdiplus::REAL)(itemInfo.buttonState * m_sizeTabBtn.cx), 0, (Gdiplus::REAL)m_sizeTabBtn.cx, (Gdiplus::REAL)m_sizeTabBtn.cy, UnitPixel); } } } // 内存dc输出到dc // 1.画原图 dc.BitBlt(m_rc.left,m_rc.top, nWidth, nTabHeight, &m_memDC, 0, 0, SRCCOPY); // 2.画鼠标热点的Tab页签 if((m_nHoverItem != -1) && (m_nHoverItem < (int)m_vecItemInfo.size())) { TabItemInfo &itemInfo = m_vecItemInfo.at(m_nHoverItem); dc.BitBlt(itemInfo.rc.left, itemInfo.rc.top, itemInfo.rc.Width(), itemInfo.rc.Height(), &m_memDC, itemInfo.rc.left - m_rc.left, itemInfo.rc.top - m_rc.top + nTabHeight, SRCCOPY); } // 3.画鼠标按下的Tab页签 if((m_nDownItem != -1) && (m_nDownItem < (int)m_vecItemInfo.size())) { TabItemInfo &itemInfo = m_vecItemInfo.at(m_nDownItem); dc.BitBlt(itemInfo.rc.left, itemInfo.rc.top, itemInfo.rc.Width(), itemInfo.rc.Height(), &m_memDC, itemInfo.rc.left - m_rc.left, itemInfo.rc.top - m_rc.top + nTabHeight * 2, SRCCOPY); } }
// 取得位置 CPoint GetOriginPoint(CRect rc, int nChildWidth, int nChildHeight, UINT uAlignment, UINT uVAlignment) { CPoint point = GetOriginPoint(rc.Width(), rc.Height(), nChildWidth, nChildHeight, uAlignment, uVAlignment); return CPoint(rc.left + point.x, rc.top + point.y); }
void CDuiText::DrawControl(CDC &dc, CRect rcUpdate) { int nWidth = m_rc.Width(); int nHeight = m_rc.Height(); // 计算显示位置 CScrollV* pScrollV = (CScrollV*)m_pControScrollV; int nCurPos = pScrollV->GetScrollCurrentPos(); // 当前top位置 int nMaxRange = pScrollV->GetScrollMaxRange(); int nVirtualTop = 0; // 当前显示的是虚拟图片中什么位置开始的图片 m_nVirtualHeight = GetVirtualHeight(); if(m_nVirtualHeight > m_rc.Height()) { nVirtualTop = (nMaxRange > 0) ? nCurPos*(m_nVirtualHeight-m_rc.Height())/nMaxRange : 0; }else { nVirtualTop = 0; } if(!m_bUpdate) { UpdateMemDC(dc, nWidth, m_nVirtualHeight); Graphics graphics(m_memDC); if(m_bBack) { SolidBrush brush(m_clrBack); graphics.FillRectangle(&brush, 0, 0, nWidth, nHeight); } else { //m_memDC.BitBlt(0, 0, nWidth, nHeight, &dc, m_rc.left ,m_rc.top, SRCCOPY); m_memDC.BitBlt(0, 0, nWidth, nHeight, &dc, m_rc.left ,m_rc.top, WHITENESS); // 画白色背景 DrawVerticalTransition(m_memDC, dc, CRect(0, 0+nVirtualTop, nWidth, nHeight+nVirtualTop), // 背景透明度 m_rc, m_nBkTransparent, m_nBkTransparent); } BSTR bsFont = m_strFont.AllocSysString(); FontFamily fontFamily(bsFont); Font font(&fontFamily, (REAL)m_nFontWidth, m_fontStyle, UnitPixel); ::SysFreeString(bsFont); SolidBrush solidBrush(m_clrText); graphics.SetTextRenderingHint( TextRenderingHintClearTypeGridFit ); // 设置水平和垂直对齐方式 DUI_STRING_ALIGN_DEFINE(); //strFormat.SetFormatFlags( StringFormatFlagsNoWrap | StringFormatFlagsMeasureTrailingSpaces); strFormat.SetFormatFlags( StringFormatFlagsNoClip | StringFormatFlagsMeasureTrailingSpaces); //strFormat.SetTrimming(StringTrimmingEllipsisWord); // 以单词为单位去尾,略去部分使用省略号 int nXPos = 0; if(m_pImage != NULL) { graphics.DrawImage(m_pImage, Rect(0, (nHeight - m_sizeImage.cy) / 2, m_sizeImage.cx, m_sizeImage.cy), 0, 0, m_sizeImage.cx, m_sizeImage.cy, UnitPixel); nXPos += m_sizeImage.cx + 5; } Size size = GetTextBounds(font, strFormat, nWidth, m_strTitle); CPoint point = GetOriginPoint(nWidth - nXPos, nHeight, size.Width, size.Height, m_uAlignment, m_uVAlignment); int nStart = m_strTitle.Find(m_strMark, m_nStart); if(m_strMark.IsEmpty() || (nStart == -1)) { int nTextWidth = nWidth - nXPos - point.x; if(m_bScrollV) { nTextWidth -= m_nScrollWidth; } // 先画阴影 if(m_bEnableShadow) { RectF rectShadow((Gdiplus::REAL)(nXPos + point.x + 1), (Gdiplus::REAL)(point.y + 1), (Gdiplus::REAL)nTextWidth, (Gdiplus::REAL)max(size.Height, nHeight)); SolidBrush solidBrushS(m_clrTextShadow); BSTR bsTitle = m_strTitle.AllocSysString(); graphics.DrawString(bsTitle, (INT)wcslen(bsTitle), &font, rectShadow, &strFormat, &solidBrushS); ::SysFreeString(bsTitle); } // 再画正常的文字 RectF rect((Gdiplus::REAL)(nXPos + point.x), (Gdiplus::REAL)point.y, (Gdiplus::REAL)nTextWidth, (Gdiplus::REAL)(max(size.Height, nHeight))); if((m_enButtonState == enBSHover) && m_bEnableHover) { SolidBrush solidBrushH(m_clrTextHover); BSTR bsTitle = m_strTitle.AllocSysString(); graphics.DrawString(bsTitle, (INT)wcslen(bsTitle), &font, rect, &strFormat, &solidBrushH); ::SysFreeString(bsTitle); }else { BSTR bsTitle = m_strTitle.AllocSysString(); graphics.DrawString(bsTitle, (INT)wcslen(bsTitle), &font, rect, &strFormat, &solidBrush); ::SysFreeString(bsTitle); } } else { SolidBrush solidBrushM(m_clrMark); SolidBrush solidBrushS(m_clrTextShadow); CString srtL = m_strTitle.Left(nStart); CString srtR = m_strTitle.Right(m_strTitle.GetLength() - m_strMark.GetLength() - nStart); Size sizeL = GetTextBounds(font, strFormat, srtL); Size sizeM = GetTextBounds(font, strFormat, m_strMark); Size sizeR = GetTextBounds(font, strFormat, srtR); if(m_bEnableShadow) { BSTR bsL = srtL.AllocSysString(); graphics.DrawString(bsL, (INT)wcslen(bsL), &font, PointF((Gdiplus::REAL)(nXPos + point.x + 1), (Gdiplus::REAL)(point.y + 1)), &strFormat, &solidBrushS); ::SysFreeString(bsL); BSTR bsMark = m_strMark.AllocSysString(); graphics.DrawString(bsMark, (INT)wcslen(bsMark), &font, PointF((Gdiplus::REAL)(nXPos + point.x + sizeL.Width + 2 + 1), (Gdiplus::REAL)(point.y + 1)), &strFormat, &solidBrushS); ::SysFreeString(bsMark); } BSTR bsL = srtL.AllocSysString(); graphics.DrawString(bsL, (INT)wcslen(bsL), &font, PointF((Gdiplus::REAL)(nXPos + point.x), (Gdiplus::REAL)point.y), &strFormat, &solidBrush); ::SysFreeString(bsL); BSTR bsMark = m_strMark.AllocSysString(); graphics.DrawString(bsMark, (INT)wcslen(bsMark), &font, PointF((Gdiplus::REAL)(nXPos + point.x + sizeL.Width + 2), (Gdiplus::REAL)point.y), &strFormat, &solidBrushM); ::SysFreeString(bsMark); if(m_bEnableShadow) { RectF rect((Gdiplus::REAL)(nXPos + point.x + sizeL.Width + sizeM.Width + 4 + 1), (Gdiplus::REAL)(point.y + 1), (Gdiplus::REAL)(nWidth - (nXPos + sizeL.Width + sizeM.Width + 4 + point.x)), (Gdiplus::REAL)nHeight); BSTR bsR = srtR.AllocSysString(); graphics.DrawString(bsR, (INT)wcslen(bsR), &font, PointF((Gdiplus::REAL)(nXPos + point.x + sizeL.Width + sizeM.Width + 4), (Gdiplus::REAL)point.y), &strFormat, &solidBrushS); ::SysFreeString(bsR); } //RectF rect(nXPos + point.x + sizeL.Width + sizeM.Width + 4, point.y, nWidth - (nXPos + sizeL.Width + sizeM.Width + 4 + point.x), size.Height); RectF rect((Gdiplus::REAL)(nXPos + point.x + sizeL.Width + sizeM.Width + 4), (Gdiplus::REAL)(point.y), (Gdiplus::REAL)(nWidth - (nXPos + sizeL.Width + sizeM.Width + 4 + point.x)), (Gdiplus::REAL)nHeight); BSTR bsR = srtR.AllocSysString(); graphics.DrawString(bsR, (INT)wcslen(bsR), &font, PointF((Gdiplus::REAL)(nXPos + point.x + sizeL.Width + sizeM.Width + 4), (Gdiplus::REAL)point.y), &strFormat, &solidBrush); ::SysFreeString(bsR); } } dc.BitBlt(m_rc.left,m_rc.top, m_rc.Width(), m_rc.Height(), &m_memDC, 0, nVirtualTop, SRCCOPY); }