void CDuiListCtrl::DrawControl(CDC &dc, CRect rcUpdate) { // 列表画图方法: // 1.列表的虚拟高度为每一行高度*行数 // 2.列表显示的top坐标由scroll控件记录 // 3.重画时候,根据top坐标位置计算出显示的第一行的序号,根据显示高度计算出显示的最后一行的序号 // 4.根据计算出的显示的行,画相应的内容到内存dc中 // 5.计算出显示的top坐标进行内存dc的拷贝 int nWidth = m_rc.Width() - m_nScrollWidth; // 减去滚动条的宽度 int nHeightAll = (int)m_vecRowInfo.size()*m_nRowHeight; // 总的虚拟高度 //m_rc.Height(); CScrollV* pScrollV = (CScrollV*)m_pControScrollV; int nCurPos = pScrollV->GetScrollCurrentPos(); // 当前top位置 int nMaxRange = pScrollV->GetScrollMaxRange(); m_nVirtualTop = (nMaxRange > 0) ? nCurPos*(nHeightAll-m_rc.Height())/nMaxRange : 0; // 当前滚动条位置对应的虚拟的top位置 if(m_nVirtualTop < 0) { m_nVirtualTop = 0; pScrollV->SetScrollCurrentPos(0); } m_nFirstViewRow = m_nVirtualTop / m_nRowHeight; // 显示的第一行序号 m_nLastViewRow = (m_nVirtualTop + m_rc.Height()) / m_nRowHeight; // 显示的最后一行序号 if(m_nLastViewRow >= (int)m_vecRowInfo.size()) { m_nLastViewRow = (int)m_vecRowInfo.size() - 1; } if(m_nLastViewRow < 0) { m_nLastViewRow = 0; } int nHeightView = (m_nLastViewRow - m_nFirstViewRow +1) * m_nRowHeight; // 显示涉及到的虚拟高度 int nYViewPos = m_nVirtualTop - (m_nFirstViewRow * m_nRowHeight); // 内存dc显示到屏幕时候的top位置 if(nYViewPos < 0) { nYViewPos = 0; } if(!m_bUpdate) { UpdateMemDC(dc, nWidth, nHeightView); Graphics graphics(m_memDC); m_memDC.BitBlt(0, 0, nWidth, nHeightView, &dc, m_rc.left ,m_rc.top, WHITENESS); // 画白色背景 DrawVerticalTransition(m_memDC, dc, CRect(0, nYViewPos, nWidth, m_rc.Height()+nYViewPos), // 背景透明度 m_rc, m_nBkTransparent, m_nBkTransparent); BSTR bsFontTitle = m_strFontTitle.AllocSysString(); FontFamily fontFamilyTitle(bsFontTitle); Font fontTitle(&fontFamilyTitle, (REAL)m_nFontTitleWidth, m_fontTitleStyle, UnitPixel); ::SysFreeString(bsFontTitle); BSTR bsFont = m_strFont.AllocSysString(); FontFamily fontFamily(bsFont); Font font(&fontFamily, (REAL)m_nFontWidth, m_fontStyle, UnitPixel); ::SysFreeString(bsFont); SolidBrush solidBrush(m_clrText); // 正常文字画刷 SolidBrush solidBrushH(m_clrTextHover); // 热点文字画刷 SolidBrush solidBrushD(m_clrTextDown); // 当前行画刷 SolidBrush solidBrushT(m_clrTitle); // 标题文字画刷 SolidBrush solidBrushS(m_clrSeperator); // 分割线画刷 graphics.SetTextRenderingHint( TextRenderingHintClearTypeGridFit ); // 普通文字的对齐方式 StringFormat strFormat; strFormat.SetAlignment(StringAlignmentNear); // 左对齐 if(m_uVAlignment == VAlign_Top) { strFormat.SetLineAlignment(StringAlignmentNear); // 上对其 }else if(m_uVAlignment == VAlign_Middle) { strFormat.SetLineAlignment(StringAlignmentCenter); // 中间对齐 }else if(m_uVAlignment == VAlign_Bottom) { strFormat.SetLineAlignment(StringAlignmentFar); // 下对齐 } strFormat.SetTrimming(StringTrimmingEllipsisWord); // 以单词为单位去尾,略去部分使用省略号 //strFormat.SetFormatFlags( StringFormatFlagsNoClip | StringFormatFlagsMeasureTrailingSpaces); if(!m_bTextWrap) { strFormat.SetFormatFlags(StringFormatFlagsNoWrap | StringFormatFlagsMeasureTrailingSpaces); // 不换行 } // 时间字段采用右对齐 StringFormat strFormatRight; strFormatRight.SetAlignment(StringAlignmentFar); // 右对齐 if(m_uVAlignment == VAlign_Top) { strFormatRight.SetLineAlignment(StringAlignmentNear); // 上对其 }else if(m_uVAlignment == VAlign_Middle) { strFormatRight.SetLineAlignment(StringAlignmentCenter); // 中间对齐 }else if(m_uVAlignment == VAlign_Bottom) { strFormatRight.SetLineAlignment(StringAlignmentFar); // 下对齐 } //strFormatRight.SetFormatFlags( StringFormatFlagsNoClip | StringFormatFlagsMeasureTrailingSpaces); if(!m_bTextWrap) { strFormatRight.SetFormatFlags(StringFormatFlagsNoWrap | StringFormatFlagsMeasureTrailingSpaces); // 不换行 } if(m_vecRowInfo.size() > 0) { for(int i = m_nFirstViewRow; i <= m_nLastViewRow && i < (int)m_vecRowInfo.size(); i++) { ListRowInfo &rowInfo = m_vecRowInfo.at(i); SolidBrush solidBrushRow(rowInfo.clrText); // 行定义的颜色 int nXPos = 0; int nVI = i - m_nFirstViewRow; // 鼠标移动到行时候显示的背景颜色 if(m_nHoverRow == i) { SolidBrush brush(m_clrRowHover); graphics.FillRectangle(&brush, 0, nVI*m_nRowHeight, nWidth, m_nRowHeight); } // 画检查框 int nCheckImgY = 3; if((m_sizeCheckBox.cy*2 > m_nRowHeight) || (m_uVAlignment == VAlign_Middle)) { nCheckImgY = (m_nRowHeight - m_sizeCheckBox.cy) / 2 + 1; } if((rowInfo.nCheck != -1) && (m_pImageCheckBox != NULL)) { int nCheckImageIndex = ((m_nHoverRow == i) ? ((rowInfo.nCheck==1) ? 4 : 1) : ((rowInfo.nCheck==1) ? 2 : 0)); graphics.DrawImage(m_pImageCheckBox, Rect(nXPos, nVI*m_nRowHeight + nCheckImgY, m_sizeCheckBox.cx, m_sizeCheckBox.cy), nCheckImageIndex * m_sizeCheckBox.cx, 0, m_sizeCheckBox.cx, m_sizeCheckBox.cy, UnitPixel); rowInfo.rcCheck.SetRect(nXPos, i*m_nRowHeight + nCheckImgY, nXPos + m_sizeCheckBox.cx, i*m_nRowHeight + nCheckImgY + m_sizeCheckBox.cy); nXPos += (m_sizeCheckBox.cx + 3); } // 画行左边图片 int nImgY = 3; if(rowInfo.pImage != NULL) { if((rowInfo.sizeImage.cy*2 > m_nRowHeight) || (m_uVAlignment == VAlign_Middle)) { nImgY = (m_nRowHeight - rowInfo.sizeImage.cy) / 2 + 1; } // 使用行数据指定的图片 graphics.DrawImage(rowInfo.pImage, Rect(nXPos, nVI*m_nRowHeight + nImgY, rowInfo.sizeImage.cx, rowInfo.sizeImage.cy), 0, 0, rowInfo.sizeImage.cx, rowInfo.sizeImage.cy, UnitPixel); nXPos += (rowInfo.sizeImage.cx + 3); }else if((rowInfo.nImageIndex != -1) && (m_pImage != NULL)) { if((m_sizeImage.cy*2 > m_nRowHeight) || (m_uVAlignment == VAlign_Middle)) { nImgY = (m_nRowHeight - m_sizeImage.cy) / 2 + 1; } // 使用索引图片 graphics.DrawImage(m_pImage, Rect(nXPos, nVI*m_nRowHeight + nImgY, m_sizeImage.cx, m_sizeImage.cy), rowInfo.nImageIndex*m_sizeImage.cx, 0, m_sizeImage.cx, m_sizeImage.cy, UnitPixel); nXPos += (m_sizeImage.cx + 3); } // 画行右边图片 int nRightImageWidth = 0; nImgY = 3; if(rowInfo.pRightImage != NULL) { if((rowInfo.sizeRightImage.cy*2 > m_nRowHeight) || (m_uVAlignment == VAlign_Middle)) { nImgY = (m_nRowHeight - rowInfo.sizeRightImage.cy) / 2 + 1; } // 使用行数据指定的图片 graphics.DrawImage(rowInfo.pRightImage, Rect(nWidth-rowInfo.sizeRightImage.cx-1, nVI*m_nRowHeight + nImgY, rowInfo.sizeRightImage.cx, rowInfo.sizeRightImage.cy), 0, 0, rowInfo.sizeRightImage.cx, rowInfo.sizeRightImage.cy, UnitPixel); nRightImageWidth = rowInfo.sizeRightImage.cx + 1; }else if((rowInfo.nRightImageIndex != -1) && (m_pImage != NULL)) { if((m_sizeImage.cy*2 > m_nRowHeight) || (m_uVAlignment == VAlign_Middle)) { nImgY = (m_nRowHeight - m_sizeImage.cy) / 2 + 1; } // 使用索引图片 graphics.DrawImage(m_pImage, Rect(nWidth-m_sizeImage.cx-1, nVI*m_nRowHeight + nImgY, m_sizeImage.cx, m_sizeImage.cy), rowInfo.nRightImageIndex*m_sizeImage.cx, 0, m_sizeImage.cx, m_sizeImage.cy, UnitPixel); nRightImageWidth = m_sizeImage.cx + 1; } // 画内容 RectF rect((Gdiplus::REAL)nXPos, (Gdiplus::REAL)(nVI*m_nRowHeight + 1), (Gdiplus::REAL)(nWidth-20), (Gdiplus::REAL)(m_bSingleLine ? (m_nRowHeight - 2) : (m_nRowHeight / 2 - 2)) ); if(!rowInfo.strTime.IsEmpty()) { Size size = GetTextBounds(font, rowInfo.strTime); rect.Width -= (size.Width + 5); } // 链接文字 int nLinkWidth = 0; if(!rowInfo.strLink2.IsEmpty()) { Size sizeLink = GetTextBounds(font, strFormatRight, rowInfo.strLink2); nLinkWidth += (sizeLink.Width + 10); RectF rectLink((Gdiplus::REAL)(nWidth-nLinkWidth-nRightImageWidth), (Gdiplus::REAL)(nVI*m_nRowHeight + (m_nRowHeight - sizeLink.Height)/2), (Gdiplus::REAL)(sizeLink.Width+8), (Gdiplus::REAL)sizeLink.Height); rowInfo.rcLink2.SetRect((int)rectLink.X,(int)rectLink.Y,(int)(rectLink.X+sizeLink.Width),(int)(rectLink.Y+rectLink.Height)); rowInfo.rcLink2.OffsetRect(0, m_nFirstViewRow*m_nRowHeight); if(((m_nHoverRow == i) || (m_nDownRow == i)) && (rowInfo.nHoverLink == 1)) { BSTR bsLink2 = rowInfo.strLink2.AllocSysString(); graphics.DrawString(bsLink2, (INT)wcslen(bsLink2), &font, rectLink, &strFormatRight, &solidBrushH); ::SysFreeString(bsLink2); }else { BSTR bsLink2 = rowInfo.strLink2.AllocSysString(); graphics.DrawString(bsLink2, (INT)wcslen(bsLink2), &font, rectLink, &strFormatRight, &solidBrush); ::SysFreeString(bsLink2); } } if(!rowInfo.strLink1.IsEmpty()) { Size sizeLink = GetTextBounds(font, strFormatRight, rowInfo.strLink1); nLinkWidth += (sizeLink.Width + 10); RectF rectLink((Gdiplus::REAL)(nWidth-nLinkWidth-nRightImageWidth), (Gdiplus::REAL)(nVI*m_nRowHeight + (m_nRowHeight - sizeLink.Height)/2), (Gdiplus::REAL)(sizeLink.Width+8), (Gdiplus::REAL)sizeLink.Height); rowInfo.rcLink1.SetRect((int)rectLink.X,(int)rectLink.Y,(int)(rectLink.X+sizeLink.Width),(int)(rectLink.Y+rectLink.Height)); rowInfo.rcLink1.OffsetRect(0, m_nFirstViewRow*m_nRowHeight); if(((m_nHoverRow == i) || (m_nDownRow == i)) && (rowInfo.nHoverLink == 0)) { BSTR bsLink1 = rowInfo.strLink1.AllocSysString(); graphics.DrawString(bsLink1, (INT)wcslen(bsLink1), &font, rectLink, &strFormatRight, &solidBrushH); ::SysFreeString(bsLink1); }else { BSTR bsLink1 = rowInfo.strLink1.AllocSysString(); graphics.DrawString(bsLink1, (INT)wcslen(bsLink1), &font, rectLink, &strFormatRight, &solidBrush); ::SysFreeString(bsLink1); } } rect.Width -= nLinkWidth; // 计算是否需要显示tip rowInfo.bNeedTitleTip = rect.Width < GetTextBounds(font, rowInfo.strTitle).Width; rowInfo.bNeedContentTip = rect.Width < GetTextBounds(font, rowInfo.strContent).Width; Size sizeTime = GetTextBounds(font, strFormatRight, rowInfo.strTime); int nTimeWidth = sizeTime.Width + 10; RectF rectTime((Gdiplus::REAL)(nWidth-nRightImageWidth-2-nTimeWidth-nLinkWidth), (Gdiplus::REAL)(nVI*m_nRowHeight + 1), (Gdiplus::REAL)nTimeWidth, (Gdiplus::REAL)(m_bSingleLine ? m_nRowHeight : (m_nRowHeight / 2)) ); if(m_nHoverRow == i) { // 画标题行 BSTR bsTitle = rowInfo.strTitle.AllocSysString(); graphics.DrawString(bsTitle, (INT)wcslen(bsTitle), &fontTitle, rect, &strFormat, &solidBrushH); ::SysFreeString(bsTitle); // 画时间 if(!rowInfo.strTime.IsEmpty()) { BSTR bsTime = rowInfo.strTime.AllocSysString(); graphics.DrawString(bsTime, (INT)wcslen(bsTime), &font, rectTime, &strFormatRight, &solidBrushH); ::SysFreeString(bsTime); } // 画内容行 if(!m_bSingleLine) { rect.Offset(0, (Gdiplus::REAL)m_nRowHeight / 2 + 2); rect.Width = (Gdiplus::REAL)nWidth-20; rect.Height = (Gdiplus::REAL)m_nRowHeight / 2 - 4; BSTR bsContent = rowInfo.strContent.AllocSysString(); graphics.DrawString(bsContent, (INT)wcslen(bsContent), &font, rect, &strFormat, &solidBrushH); ::SysFreeString(bsContent); } }else if(m_nDownRow == i) { // 画标题行 BSTR bsTitle = rowInfo.strTitle.AllocSysString(); graphics.DrawString(bsTitle, (INT)wcslen(bsTitle), &fontTitle, rect, &strFormat, &solidBrushD); ::SysFreeString(bsTitle); // 画时间 if(!rowInfo.strTime.IsEmpty()) { BSTR bsTime = rowInfo.strTime.AllocSysString(); graphics.DrawString(bsTime, (INT)wcslen(bsTime), &font, rectTime, &strFormatRight, &solidBrushD); ::SysFreeString(bsTime); } // 画内容行 if(!m_bSingleLine) { rect.Offset(0, (Gdiplus::REAL)m_nRowHeight / 2 + 2); rect.Width = (Gdiplus::REAL)nWidth-20; rect.Height = (Gdiplus::REAL)m_nRowHeight / 2 - 4; BSTR bsContent = rowInfo.strContent.AllocSysString(); graphics.DrawString(bsContent, (INT)wcslen(bsContent), &font, rect, &strFormat, &solidBrushD); ::SysFreeString(bsContent); } }else { // 画标题行 BSTR bsTitle = rowInfo.strTitle.AllocSysString(); graphics.DrawString(bsTitle, (INT)wcslen(bsTitle), &fontTitle, rect, &strFormat, rowInfo.bRowColor ? &solidBrushRow : &solidBrushT); ::SysFreeString(bsTitle); // 画时间 if(!rowInfo.strTime.IsEmpty()) { BSTR bsTime = rowInfo.strTime.AllocSysString(); graphics.DrawString(bsTime, (INT)wcslen(bsTime), &font, rectTime, &strFormatRight, rowInfo.bRowColor ? &solidBrushRow : &solidBrush); ::SysFreeString(bsTime); } // 画内容行 if(!m_bSingleLine) { rect.Offset(0, (Gdiplus::REAL)m_nRowHeight / 2 + 2); rect.Width = (Gdiplus::REAL)nWidth-20; rect.Height = (Gdiplus::REAL)m_nRowHeight / 2 - 4; BSTR bsContent = rowInfo.strContent.AllocSysString(); graphics.DrawString(bsContent, (INT)wcslen(bsContent), &font, rect, &strFormat, rowInfo.bRowColor ? &solidBrushRow : &solidBrush); ::SysFreeString(bsContent); } } // 画分隔线(采用拉伸模式) if(m_pImageSeperator != NULL) { // 使用拉伸模式属性画图 graphics.DrawImage(m_pImageSeperator, RectF(0, (Gdiplus::REAL)((nVI+1)*m_nRowHeight), (Gdiplus::REAL)(nWidth-2), (Gdiplus::REAL)m_sizeSeperator.cy), 0, 0, (Gdiplus::REAL)m_sizeSeperator.cx, (Gdiplus::REAL)m_sizeSeperator.cy, UnitPixel); // 使用平铺方式填充矩形(暂不使用这种方式) //TextureBrush tileBrush(m_pImageSeperator, WrapModeTile); //graphics.FillRectangle(&tileBrush, RectF(0, (nVI+1)*m_nRowHeight, nWidth-2, m_sizeSeperator.cy)); }else { // 未指定图片,则画矩形 graphics.FillRectangle(&solidBrushS, 0, (nVI+1)*m_nRowHeight, nWidth-2, 1); } } } } // 输出到界面DC,使用与的方式合并背景 dc.BitBlt(m_rc.left,m_rc.top, nWidth, m_rc.Height(), &m_memDC, 0, nYViewPos, SRCCOPY);//SRCAND); }
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); }