void CGraphs::ClearGraph() { CRect rc; GetClientRect(rc); CBrush bkBrush(g_ColorBack); m_MemDC.FillRect(rc, &bkBrush); DrawGrid(&m_MemDC, &rc); }
void CAnimateLineDrawView::OnDraw(CDC* pDC) { CAnimateLineDrawDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 // 在客户屏幕上建立一个曲线绘制区域,区域大小为200 x 100,背景为方格黑色背景 CRect rect(200,100,400,200); CBrush bkBrush(HS_CROSS,RGB(0,128,0)); pDC->SetBkColor(RGB(0,0,0)); pDC->FillRect(rect,&bkBrush); //创建一个和设备描述表兼容的位图,尺寸大小为195 x 100,用来保存需要移动的曲线图 if(m_dc.GetSafeHdc()==NULL) { CRect rect1(0,0,195,100); m_dc.CreateCompatibleDC(pDC); m_bitmap.CreateCompatibleBitmap(pDC,195,100); m_dc.SelectObject(m_bitmap); m_dc.SetBkColor(RGB(0,0,0)); m_dc.FillRect(rect1,&bkBrush); } }
void CGraphs::ShiftLeft() { CRect rcClient; GetClientRect(rcClient); if (m_MemDC.GetSafeHdc() != NULL) { CRect rcRight = rcClient; rcRight.left = rcRight.right - WIDTH; m_MemDC.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_MemDC, WIDTH, 0, SRCCOPY); CBrush bkBrush(g_ColorBack); m_MemDC.FillRect(rcRight, &bkBrush); } }
void cbRowDragPlugin::DrawEmptyRow( wxDC& dc, wxRect& rowBounds ) { wxBrush bkBrush( mpLayout->mDarkPen.GetColour(), wxSOLID ); // paint the "dark" empty-row placeholder dc.SetBrush( bkBrush ); dc.SetPen ( mpLayout->mNullPen ); dc.DrawRectangle( rowBounds.x, rowBounds.y, rowBounds.width+1, rowBounds.height+1 ); dc.SetBrush( wxNullBrush ); }
void CTesthelpCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/) { // Drawing code, mostly plagiarized from the Circ MFC sample. // The only thing done here is setting the border and drawing text // specified by our name properties in the control's client area. if(!GetBorderStyle()) //Control will always have a border. SetBorderStyle(TRUE); // Set up variables to use for drawing text background. // Use our current BackColor for the background color. CBrush* pOldBrush; CBrush bkBrush(TranslateColor(GetBackColor())); CPen* pOldPen; CRect rc = rcBounds; CFont* pOldFont; // Set up background mode and text color. Use the // current ForeColor for the text color. pdc->SetTextColor(TranslateColor(GetForeColor())); pdc->SetBkMode(TRANSPARENT); // Fill our window with the current BackColor pdc->FillRect(rcBounds, &bkBrush); // Save off the existing brush and pen so they // can be restored when we're done. pOldBrush = pdc->SelectObject(&bkBrush); pOldPen = (CPen*)pdc->SelectStockObject(BLACK_PEN); // Save off the current font so we can restore it and // select our current stock font into this DC pOldFont = SelectStockFont(pdc); // Draw the text on our window pdc->ExtTextOut(rc.left+10, rc.top +2, ETO_CLIPPED, rc, m_szName1, m_szName1.GetLength(), NULL); pdc->ExtTextOut(rc.left+10, rc.top +22, ETO_CLIPPED, rc, m_szName2, m_szName2.GetLength(), NULL); pdc->ExtTextOut(rc.left+10, rc.top +42, ETO_CLIPPED, rc, m_szName3, m_szName3.GetLength(), NULL); // Restore our DC to it's original state. pdc->SelectObject(pOldFont); pdc->SelectObject(pOldPen); pdc->SelectObject(pOldBrush); }
void CAnimateLineDrawView::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CClientDC dc(this); static int x = 200; static int y = 200; CPen pen1(PS_SOLID,0,RGB(255,0,8)); CPen *pOldPen = dc.SelectObject(&pen1); //以下代码实现动态曲线 x = x+ m_offsetx; // 如果曲线没有超过屏幕图片框右边界线,直接在屏幕图片框内绘制曲线,不用平移 if( x <= 400) { dc.MoveTo(x-m_offsetx,y); y = 200 - rand()%90; //模拟数据采样值 dc.LineTo(x,y); } else // 如果超过屏幕图片框右边界线,直需要平移曲线图 { CRect rect(200,100,400,200); CBrush bkBrush(HS_CROSS,RGB(0,128,0)); // 保存需要移动的曲线图像 m_dc.BitBlt(0,0,195,100,&dc,205,100,SRCCOPY); // 用背景图重绘屏幕图片框,消隐其中的所有曲线 dc.SetBkColor(RGB(0,0,0)); dc.FillRect(rect,&bkBrush); //将保存的曲线图向左平移5个单位 dc.BitBlt(200,100,195,100,&m_dc,0,0,SRCCOPY); // 用新数据继续绘制曲线 dc.MoveTo(395,y); y = 200 - rand()%90; //模拟数据采样值 dc.LineTo(400,y); } dc.SelectObject(pOldPen); CView::OnTimer(nIDEvent); }
BOOL CLineChartCtrl::RedrawScale (CClientDC& dc, const CRect& rcClient) { if (m_Bitmap.GetSafeHandle() != NULL) { if (!m_Bitmap.DeleteObject()) return FALSE; } if (!m_Bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height())) return FALSE; if (NULL == m_MemDC.SelectObject(m_Bitmap)) return FALSE; // draw scale m_MemDC.SetBkColor(m_ScaleBGCol); CBrush bkBrush(HS_CROSS,m_ScaleFGCol); m_MemDC.FillRect(rcClient,&bkBrush); return TRUE; }
void AxImage::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) { // Paint the background using the BackColor property CBrush bkBrush(TranslateColor(GetBackColor())); pdc->FillRect(rcBounds, &bkBrush); if (image && image->IsValid()){ if (m_stretch){ image->Draw(pdc->GetSafeHdc(),0,0,rcBounds.Width(),rcBounds.Height()); } else { image->Draw(pdc->GetSafeHdc()); } } if (m_border){ RECT r={rcBounds.left,rcBounds.top,rcBounds.right,rcBounds.bottom}; pdc->DrawEdge(&r,EDGE_SUNKEN,BF_RECT); } // DoSuperclassPaint(pdc, rcBounds); }
void CCircCtrl::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect&) { CBrush* pOldBrush; CBrush bkBrush(TranslateColor(GetBackColor())); CPen* pOldPen; CRect rc = rcBounds; CFont* pOldFont; TEXTMETRIC tm; const CString& strCaption = InternalGetText(); // Set the ForeColor property color and transparent background mode into the device context pdc->SetTextColor(TranslateColor(GetForeColor())); pdc->SetBkMode(TRANSPARENT); // Paint the background using the BackColor property pdc->FillRect(rcBounds, &bkBrush); // Draw the ellipse using the BackColor property and a black pen GetDrawRect(&rc); pOldBrush = pdc->SelectObject(&bkBrush); pOldPen = (CPen*)pdc->SelectStockObject(BLACK_PEN); pdc->Ellipse(rc); // Draw the caption and note using the stock Font and ForeColor properties pOldFont = SelectStockFont(pdc); GetStockTextMetrics(&tm); pdc->SetTextAlign(TA_CENTER | TA_TOP); pdc->ExtTextOut((rc.left + rc.right) / 2, (rc.top + rc.bottom - tm.tmHeight) / 2, ETO_CLIPPED, rc, strCaption, strCaption.GetLength(), NULL); pdc->SetTextAlign(TA_LEFT | TA_TOP); pdc->ExtTextOut(rcBounds.left, rcBounds.top, ETO_CLIPPED, rcBounds, m_note, m_note.GetLength(), NULL); pdc->SelectObject(pOldFont); pdc->SelectObject(pOldPen); pdc->SelectObject(pOldBrush); }
void cbRowDragPlugin::DrawCollapsedRowsBorder( wxDC& dc ) { int colRowOfs = GetCollapsedIconsPos(); wxRect& bounds = mpPane->mBoundsInParent; wxBrush bkBrush( mpLayout->mGrayPen.GetColour(), wxSOLID ); dc.SetBrush( bkBrush ); dc.SetPen( mpLayout->mDarkPen ); if ( mpPane->IsHorizontal() ) dc.DrawRectangle( bounds.x + mpPane->mLeftMargin - ROW_DRAG_HINT_WIDTH - 1, colRowOfs, bounds.width - mpPane->mLeftMargin - mpPane->mRightMargin + 2 + ROW_DRAG_HINT_WIDTH, COLLAPSED_ICON_HEIGHT + 1); else dc.DrawRectangle( colRowOfs, bounds.y + mpPane->mTopMargin - 1, COLLAPSED_ICON_HEIGHT + 1, bounds.height - mpPane->mTopMargin - mpPane->mBottomMargin - ROW_DRAG_HINT_WIDTH - 2 ); dc.SetBrush( wxNullBrush ); }
void CLineChartCtrl::DrawSpike() { if (NULL == m_MemDC.GetSafeHdc()) return; CRect rcClient; GetClientRect(rcClient); m_MemDC.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_MemDC, 4, 0, SRCCOPY); // draw scale CRect rcRight = rcClient; rcRight.left = rcRight.right - 4; m_MemDC.SetBkColor(m_ScaleBGCol); CBrush bkBrush(HS_HORIZONTAL,m_ScaleFGCol); m_MemDC.FillRect(rcRight,&bkBrush); static BOOL bDrawVerticle = FALSE; bDrawVerticle = !bDrawVerticle; // Draw Verticle lines only every two steps if (bDrawVerticle) { CPen pen(PS_SOLID, 1, m_ScaleFGCol); CPen* pOldPen = m_MemDC.SelectObject(&pen); m_MemDC.MoveTo(CPoint(rcClient.right-2, rcClient.top)); m_MemDC.LineTo(CPoint(rcClient.right-2, rcClient.bottom)); m_MemDC.SelectObject(pOldPen); } int nCount = m_items.GetSize(); CPoint ptOld, ptNew; const UINT uRcHeight=rcRight.Height(); for (int i=0; i < nCount; i++) { CLineChartItem *pItem=m_items.GetAt(i); #ifdef _DEBUG ASSERT(pItem != NULL); #else if (NULL == pItem) continue; #endif LINECHARTITEMPOSCFN lpfnPcfn=pItem->m_lpfnPcfn; if (lpfnPcfn != NULL) { pItem->m_nOldPos = pItem->m_nPos; pItem->m_nPos = (*lpfnPcfn)(pItem); } if (pItem->m_nOldPos > pItem->m_nUpper) pItem->m_nOldPos = pItem->m_nUpper; if (pItem->m_nOldPos < pItem->m_nLower) pItem->m_nOldPos = pItem->m_nLower; if (pItem->m_nPos > pItem->m_nUpper) pItem->m_nPos = pItem->m_nUpper; if (pItem->m_nPos < pItem->m_nLower) pItem->m_nPos = pItem->m_nLower; const UINT nRange=(pItem->m_nUpper - pItem->m_nLower); ptOld.x = rcRight.left-1; // Minus one to make sure to draw inside the area ptNew.x = rcRight.right-1; const UINT uOldDiff=(pItem->m_nUpper - pItem->m_nOldPos); ptOld.y = (int) (((float) uOldDiff * (float) uRcHeight) / (float) nRange); const UINT uNewDiff=(pItem->m_nUpper - pItem->m_nPos); ptNew.y = (int) (((float) uNewDiff * (float) uRcHeight) / (float) nRange); CPen pen(PS_SOLID, 1, pItem->m_colorLine); CPen *pOldPen=m_MemDC.SelectObject(&pen); ASSERT(pOldPen != NULL); m_MemDC.MoveTo(ptOld); m_MemDC.LineTo(ptNew); m_MemDC.SelectObject(pOldPen); } }
void CClipMonView::OnDraw( CDC *pDC) { CRect rcClient; TxGetClientRect(rcClient); Graphics gc(pDC->GetSafeHdc()); SolidBrush bkBrush(m_drawParam.bkColor); Rect rCet = CRect2Rect(rcClient); gc.FillRectangle(&bkBrush, rCet); CSize szView = GetScrollViewSize(); CRect rcView(0, 0, szView.cx, szView.cy); rcView.OffsetRect(rcClient.left, rcClient.top); if (rcView.IsRectEmpty()) { return; } rcView.OffsetRect(-GetScrollPos(SB_HORZ), -GetScrollPos(SB_VERT)); GraphicsContainer container = gc.BeginContainer(); Rect rClip = CRect2Rect(rcClient); gc.SetClip(rClip); if (m_bUseBkBuffer) { CRect rcBuffToDraw(0,0,rcClient.Width(), rcClient.Height()); rcBuffToDraw.OffsetRect(GetScrollPos(SB_HORZ), GetScrollPos(SB_VERT)); if (!IsInRect(rcBuffToDraw, m_rcViewBkBuffer)) { TRACE("\nbufferRedraw %d, %d", rcBuffToDraw.bottom, m_rcViewBkBuffer.bottom); ReDrawBkBuffer(); } //draw bkbuffer m_BkBufferlock.Lock(); rcBuffToDraw.OffsetRect(-m_rcViewBkBuffer.left, -m_rcViewBkBuffer.top); gc.DrawImage(m_pBmpBackBuffer, rClip, rcBuffToDraw.left, rcBuffToDraw.top, rcBuffToDraw.Width(), rcBuffToDraw.Height(), UnitPixel); m_BkBufferlock.Unlock(); } else { int nBegin = (rcClient.top - rcView.top) / m_drawParam.nItemHeight; int nCount = rcClient.Height() /m_drawParam.nItemHeight +1; VECTMPITEM vData; g_monDataMgr.GetRangeData(nBegin, nCount, vData); nCount = vData.size(); CTxListHeader& headerCtrl = GetListHeader(); int nTopPos = rcView.top + (nBegin * m_drawParam.nItemHeight); Gdiplus::StringFormat fmt; fmt.SetAlignment(StringAlignmentNear); fmt.SetLineAlignment(StringAlignmentCenter); fmt.SetTrimming(StringTrimmingEllipsisCharacter); fmt.SetFormatFlags(StringFormatFlagsLineLimit); Pen pen(g_globalInfo.viewSetting.clrSeparateLine, 1.0); Rect rRowBk(rcClient.left, nTopPos, rcClient.Width(), m_drawParam.nItemHeight); for (int i = 0; i < nCount; i++) { ARGB clr = 0xff000000; ARGB clrBk = 0xffffffff; vData[i].GetMonColor(clr, clrBk); bkBrush.SetColor(clrBk); gc.FillRectangle(&bkBrush, rRowBk); int nLeftPos = rcView.left; CRect rcItem(nLeftPos,nTopPos, 0, nTopPos + m_drawParam.nItemHeight); for (int cIdx = 0; cIdx < m_ColSetting.m_vTmpCols.size(); cIdx++) { if (rcItem.left > rcClient.right) { break; } rcItem.right = rcItem.left + headerCtrl.GetHeaderWidth(cIdx); if (rcItem.right >= rcClient.left) { CString strText = vData[i].GetValue((ENUM_MONTYPE)(m_ColSetting.m_vTmpCols[cIdx].nPosInType)); GPDrawShadowTextSimple(gc, strText, rcItem, *m_drawParam.pFont, clr, 0, 2,2, &fmt); //GPDrawShadowText(gc, strText, rcItem, *m_drawParam.pFont, clr, 0xff000000,0,0,0,0,&fmt); //draw separate line gc.DrawLine(&pen, rcItem.right-1, rcItem.top, rcItem.right-1, rcItem.bottom); } rcItem.OffsetRect(rcItem.Width(), 0); } gc.DrawLine(&pen, rcClient.left, rcItem.bottom-1, rcClient.right, rcItem.bottom-1); nTopPos += m_drawParam.nItemHeight; rRowBk.Offset(0, m_drawParam.nItemHeight); } } //calc In Bound Item gc.EndContainer(container); ReDrawRemainTime(pDC); }
void CClipMonView::ReDrawRemainTime(CDC* pDC) { CRect rcClient; TxGetClientRect(rcClient); if (m_scBar[SB_VERT].IsShowing()) { rcClient.DeflateRect(0,0,m_scBar[SB_VERT].GetBarWidth(), 0); } if (m_scBar[SB_HORZ].IsShowing()) { rcClient.DeflateRect(0,0, 0, m_scBar[SB_HORZ].GetBarWidth()); } // Rect rCet = CRect2Rect(rcClient); // gc.FillRectangle(&bkBrush, rCet); CSize szView = GetScrollViewSize(); CRect rcView(0, 0, szView.cx, szView.cy); rcView.OffsetRect(rcClient.left, rcClient.top); if (rcView.IsRectEmpty()) { return; } rcView.OffsetRect(-GetScrollPos(SB_HORZ), -GetScrollPos(SB_VERT)); int nBegin = (rcClient.top - rcView.top) / m_drawParam.nItemHeight; int nCount = rcClient.Height() /m_drawParam.nItemHeight +1; VECTMPITEM vData; g_monDataMgr.GetRangeData(nBegin, nCount, vData); nCount = vData.size(); if (nCount <= 0) { return; } CTxListHeader& headerCtrl = GetListHeader(); int nLeftPos = rcView.left; int nRightPos = 0; for (int cIdx = 0; cIdx < m_ColSetting.m_vTmpCols.size(); cIdx++) { ENUM_MONTYPE nMonType = (ENUM_MONTYPE)(m_ColSetting.m_vTmpCols[cIdx].nPosInType); if (nMonType == MONTYPE_TIMEREMAIN) { nRightPos = nLeftPos + headerCtrl.GetHeaderWidth(cIdx); break; } else { nLeftPos += headerCtrl.GetHeaderWidth(cIdx); } } if (nRightPos < rcClient.left || nLeftPos > rcClient.right) { return; } CPoint ptOffSetBmp; int nTopPos = rcView.top + (nBegin * m_drawParam.nItemHeight); ptOffSetBmp.x = nLeftPos < 0? -nLeftPos:0; ptOffSetBmp.y = nTopPos < rcClient.top? rcClient.top - nTopPos: 0; CRect rcRemainTimeClient(nLeftPos, rcClient.top, nRightPos-1, rcClient.bottom); Graphics gc(m_pBmpRemainTime); SolidBrush bkBrush(m_drawParam.bkColor); GraphicsContainer container = gc.BeginContainer(); int nClipHeight = m_drawParam.nItemHeight*nCount; if (nClipHeight < rcClient.Height()) { nClipHeight = rcClient.Height(); } Rect rClip(0,0, rcRemainTimeClient.Width(), nClipHeight); gc.SetClip(rClip); Rect rDes(nLeftPos, nTopPos, rClip.Width, rClip.Height); gc.FillRectangle(&bkBrush, rClip); Gdiplus::StringFormat fmt; fmt.SetAlignment(StringAlignmentCenter); fmt.SetLineAlignment(StringAlignmentCenter); fmt.SetTrimming(StringTrimmingEllipsisCharacter); fmt.SetFormatFlags(StringFormatFlagsLineLimit); Pen pen(g_globalInfo.viewSetting.clrSeparateLine, 1.0); Rect rRowBk(0, 0, rcRemainTimeClient.Width(), m_drawParam.nItemHeight); CRect rcItem(0,0, rRowBk.Width,rRowBk.Height); for (int i = 0; i < nCount; i++) { ARGB clr = 0xff000000; ARGB clrBk = 0xffffffff; vData[i].GetMonColor(clr, clrBk); bkBrush.SetColor(clrBk); gc.FillRectangle(&bkBrush, rRowBk); CString strText = vData[i].GetValue(MONTYPE_TIMEREMAIN); GPDrawShadowTextSimple(gc, strText, rcItem, *m_drawParam.pFont, clr, 0, 2,2, &fmt); //GPDrawShadowText(gc, strText, rcItem, *m_drawParam.pFont, clr, 0xff000000,0,0,0,0,&fmt); gc.DrawLine(&pen, rcItem.left, rcItem.bottom-1, rcItem.right, rcItem.bottom-1); nTopPos += m_drawParam.nItemHeight; rcItem.OffsetRect(0, m_drawParam.nItemHeight); rRowBk.Offset(0, m_drawParam.nItemHeight); } gc.EndContainer(container); Graphics gcDes(pDC->GetSafeHdc()); CRect rcDesClip(rcRemainTimeClient); Rect rDesClip = CRect2Rect(rcDesClip); gcDes.SetClip(rDesClip); gcDes.DrawImage(m_pBmpRemainTime, rDesClip, ptOffSetBmp.x, ptOffSetBmp.y, (INT)rDesClip.Width, (INT)rDesClip.Height, UnitPixel); }
void CClipMonView::ReDrawBkBuffer() { if (!m_bUseBkBuffer) { return; } CSize szView = GetScrollViewSize(); if (szView.cx == 0 || szView.cy == 0) { return; } CRect rcClient; TxGetClientRect(rcClient); CRect rcViewShowBuffer(rcClient); rcViewShowBuffer.MoveToXY(0,0); rcViewShowBuffer.OffsetRect(GetScrollPos(SB_HORZ), GetScrollPos(SB_VERT)); CRect rcBk(0,0, m_szbmpBackBuffer.cx, m_szbmpBackBuffer.cy); rcBk = GetCenterRect(rcViewShowBuffer, rcBk); if (rcBk.left < 0) { rcBk.MoveToX(0); } if (rcBk.top < 0) { rcBk.MoveToY(0); } m_rcViewBkBuffer = rcBk; m_BkBufferlock.Lock(); ASSERT(m_pBmpBackBuffer != NULL); Graphics gc(m_pBmpBackBuffer); SolidBrush bkBrush(m_drawParam.bkColor); Rect rCet = CRect2Rect(CRect(0,0, rcBk.Width(), rcBk.Height())); gc.FillRectangle(&bkBrush, rCet); CRect rcView(0, 0, szView.cx, szView.cy); //calc In Bound Item int nBegin = (rcBk.top - rcView.top) / m_drawParam.nItemHeight; int nCount = rcBk.Height() /m_drawParam.nItemHeight +1; VECTMPITEM vData; g_monDataMgr.GetRangeData(nBegin, nCount, vData); nCount = vData.size(); if (nCount == 0) { return; } CTxListHeader& headerCtrl = GetListHeader(); int nTopPos = rcView.top + (nBegin * m_drawParam.nItemHeight)- rcBk.top; Gdiplus::StringFormat fmt; fmt.SetAlignment(StringAlignmentCenter); fmt.SetLineAlignment(StringAlignmentCenter); fmt.SetTrimming(StringTrimmingEllipsisCharacter); fmt.SetFormatFlags(StringFormatFlagsLineLimit|StringFormatFlagsNoWrap); Pen pen(g_globalInfo.viewSetting.clrSeparateLine, 1.0); Rect rRowBk(0, nTopPos, rcBk.Width(), m_drawParam.nItemHeight); for (int i = 0; i < nCount; i++) { ARGB clr = 0xff000000; ARGB clrBk = 0xffffffff; vData[i].GetMonColor(clr, clrBk); bkBrush.SetColor(clrBk); gc.FillRectangle(&bkBrush, rRowBk); int nLeftPos = 0-rcBk.left; CRect rcItem(nLeftPos,nTopPos, 0, nTopPos + m_drawParam.nItemHeight); for (int cIdx = 0; cIdx < m_ColSetting.m_vTmpCols.size(); cIdx++) { if (rcItem.left > rcBk.right) { break; } rcItem.right = rcItem.left + headerCtrl.GetHeaderWidth(cIdx); if (rcItem.right >= rcBk.left) { ENUM_MONTYPE nMonType = (ENUM_MONTYPE)(m_ColSetting.m_vTmpCols[cIdx].nPosInType); if (nMonType != MONTYPE_TIMEREMAIN) { CString strText = vData[i].GetValue(nMonType); GPDrawShadowTextSimple(gc, strText, rcItem, *m_drawParam.pFont, clr, 0, 2,2, &fmt); //GPDrawShadowText(gc, strText, rcItem, *m_drawParam.pFont, clr, 0x22000000,0,0,0,0,&fmt); } //draw separate line gc.DrawLine(&pen, rcItem.right-1, rcItem.top, rcItem.right-1, rcItem.bottom); } rcItem.OffsetRect(rcItem.Width(), 0); } gc.DrawLine(&pen, rcBk.left, rcItem.bottom-1, rcBk.right, rcItem.bottom-1); nTopPos += m_drawParam.nItemHeight; rRowBk.Offset(0, m_drawParam.nItemHeight); } m_BkBufferlock.Unlock(); }