通过内存画图,当放大到一定程度时,再拖动滚动条显示图像时,总是出现毛刺,但如果用一般的画图方法就不会出现这种情况。这个问题困扰了许久,不知道该怎么解决,望兄弟姐妹们提供帮助!
解决方案 »
- 请问怎样播放xvid压缩格式的avi文件
- 如何获取ShellExecute打开程序的主窗口hwnd
- 使用画笔画完图后,如果没有把旧的画笔选入到设备对象,会造成什么后果
- 问个简单的VC问题
- 请问如何把一个FormView添加到CTabCtrl控件内???
- 十进制转换成二进制的函数是什么
- 有关菜单,操作MF_GRAYED之后,如何让它再变成正常状态?
- 关于VC ADO的Find方法的使用。
- 苦恼!用asp调用ATL作的组件(很简单的组件)!
- 如何构造可以越过MainFrame边界的子窗口?
- 如何实现在设计时,指定一个ActiveX控件和另一个ActiveX控件关联?
- 怎么用ATL COM AppWizard创建一个继承自CWnd的ATL控件呢??
void CPCBView::OnDraw(CDC* pDC)
{
CPCBDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC dcMemory;
CDC* pDrawDC = pDC;
CBitmap bitmap;
CBitmap* pOldBitmap;
// only paint the rect that needs repainting
CRect client;
pDC->GetClipBox(client); //取得逻辑坐标
CRect rect = client;
pDC->LPtoDP(&rect);
rect.NormalizeRect();
// draw to offscreen bitmap for fast looking repaints
if (dcMemory.CreateCompatibleDC(pDC))
{
if (bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()))
{
OnPrepareDC(&dcMemory,NULL);
pDrawDC = &dcMemory;
dcMemory.OffsetViewportOrg(-rect.left, -rect.top);
pOldBitmap = dcMemory.SelectObject(&bitmap);
dcMemory.SetBrushOrg(rect.left % 8, rect.top % 8);
// might as well clip to the same rectangle
dcMemory.IntersectClipRect(client);
}
}
// paint background
CBrush brush;
if (!brush.CreateSolidBrush(RGB(0,0,0)))
{
return;
}
brush.UnrealizeObject();
pDrawDC->FillRect(client, &brush);
//绘出PCB版图(彩色)
pDoc->m_pPCBDesign->Draw(pDrawDC, m_nLayer, TRUE);
//绘出注释图形
POSITION pos = m_DrawObjList.GetHeadPosition();
while (NULL != pos)
{
CDrawObj* pObj = m_DrawObjList.GetNext(pos);
pObj->Draw(pDrawDC);
}
if (pDrawDC != pDC) //drawing in the view
{
pDC->SetViewportOrg(0, 0);
pDC->SetWindowOrg(0,0);
pDC->SetMapMode(MM_TEXT);
dcMemory.SetViewportOrg(0, 0);
dcMemory.SetWindowOrg(0,0);
dcMemory.SetMapMode(MM_TEXT);
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&dcMemory, 0, 0, SRCCOPY);
dcMemory.SelectObject(pOldBitmap);
}
CZoomReView::OnDraw(pDC);
}
不过我不喜欢你的代码结构。