大家好  这是我在MFC单文档下的按键的实现代码  点击按键后绘制的图形出现了错位,上侧和左侧各有黑色的一条
我想让rect里完全是我绘的图不要有黑色的  请问大家产生黑条的原因是什么?
void CtestgdiView::OnTestTest1()
{
// TODO: 在此添加命令处理程序代码
CRect rect;
GetClientRect(&rect);
rect.left+=155;
rect.right+=155;
rect.top+=30;
rect.bottom+=30;
CDC* pdc=GetDC();
GetClientRect(&rect);
rect.left+=155;
rect.top+=30;[code=C/C++]
pdc->Rectangle(&rect);
pdc->MoveTo(rect.left,rect.top);
pdc->LineTo(rect.right,rect.bottom);
CDC dcMem; //用于缓冲作图的内存DC 
CBitmap bmp; //内存中承载临时图象的位图 
dcMem.CreateCompatibleDC(pdc); //依附窗口DC创建兼容内存DC 
//m_ctrlListCtrl.GetClientRect(&rect);
bmp.CreateCompatibleBitmap(pdc,rect.Width(),rect.Height());//创建兼容位图 
dcMem.SelectObject(&bmp); //将位图选择进内存DC 
dcMem.FillSolidRect(&rect,pdc->GetBkColor()); //按原来背景填充客户区,不然会是黑色 
dcMem.Rectangle(&rect);
dcMem.MoveTo(rect.left,rect.top);
dcMem.LineTo(rect.right,rect.bottom);
pdc->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(), &dcMem,0,0,SRCCOPY);//将内存DC上的图象拷贝到前台 
dcMem.DeleteDC(); //删除DC
bmp.DeleteObject(); //删除位图 
ReleaseDC(pdc);
}
[/code]

解决方案 »

  1.   

    概念问题啊,还是没领会双缓存的概念
    全部动作都放在dcMem中操作,包括你的
    pdc->Rectangle(&rect);
    pdc->MoveTo(rect.left,rect.top);
    pdc->LineTo(rect.right,rect.bottom);
    都应该放进去。计算坐标这个帮不了你,你要的位置你这个肯定得自己计算了
      

  2.   

    建议详细看看windows程序设计这本书,这样像这种问题根本不是问题;
      

  3.   

            CRect rect;
    GetClientRect(&rect);
    rect.left+=155;
    rect.right+=155;
    rect.top+=30;
    rect.bottom+=30;
    CRect tmprect = rect;
    CDC* pdc=GetDC();
    CClientDC dc(this);
    CDC dcMem; //用于缓冲作图的内存DC 
    CBitmap bmp; //内存中承载临时图象的位图 
    dcMem.CreateCompatibleDC(pdc); //依附窗口DC创建兼容内存DC 
    bmp.CreateCompatibleBitmap(pdc,rect.Width(),rect.Height());//创建兼容位图 
    dcMem.SelectObject(&bmp); //将位图选择进内存DC 
    dcMem.FillSolidRect(&tmprect,pdc->GetBkColor()); //按原来背景填充客户区,不然会是黑色 
    CPen myPen1(PS_SOLID, 2, RGB(255,0,0));
    dcMem.SelectObject(myPen1);
    dcMem.Rectangle(&rect);
    pdc->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(), &dcMem,0,0,SRCCOPY);//将内存DC上的图象拷贝到前台
    CString str1;
    str1.Format(_T("%d.%d"),rect.left,rect.top);
    pdc->TextOut(rect.left,rect.top,str1);
    dcMem.DeleteDC(); //删除DC
    bmp.DeleteObject(); //删除位图 
    ReleaseDC(pdc);
    都在dcmem中画还是有问题   有人遇到过这个问题吗?   sohu2011建议试一下程序看看和预想的一不一样?
      

  4.   

    那是BORDER
    GetWindowRect
    试试
      

  5.   

       pdc->BitBlt(0,0,rect.Width(),rect.Height(), &dcMem,0,0,SRCCOPY);rect.left+=155;rect.top+=30;使BitBlt开始位置变了,开始位置设为0,0就好了
      

  6.   

    pdc->Rectangle(&rect);
    pdc->MoveTo(rect.left,rect.top);
    pdc->LineTo(rect.right,rect.bottom);
    应该是用你的memdc进行绘制,而不是pDC