大家好 这是我在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]
我想让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]
全部动作都放在dcMem中操作,包括你的
pdc->Rectangle(&rect);
pdc->MoveTo(rect.left,rect.top);
pdc->LineTo(rect.right,rect.bottom);
都应该放进去。计算坐标这个帮不了你,你要的位置你这个肯定得自己计算了
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建议试一下程序看看和预想的一不一样?
GetWindowRect
试试
pdc->MoveTo(rect.left,rect.top);
pdc->LineTo(rect.right,rect.bottom);
应该是用你的memdc进行绘制,而不是pDC