坐标映射(bitblt)?
在gdi作图中,为了避免屏幕的闪烁,我创建了一个和要显示图形pdc的兼容的内存dc对像和位图对象。
然后把pdc和兼容的dc的坐标原点都设在整个窗口客户的中心。如下:
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC, cr.right, cr.bottom);
CBitmap* pOldBitmap = MemDC.SelectObject(&MemBitmap);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowOrg(0, 0);
pDC->SetViewportOrg(cr.right/2, cr.bottom / 2);
pDC->SetWindowExt(cr.right, cr.bottom);
pDC->SetViewportExt(cr.right, -cr.bottom);
pMemDC->SetMapMode(MM_ANISOTROPIC);
pMemDC->SetWindowOrg(0, 0);
pMemDC->SetViewportOrg(cr.right/2, cr.bottom / 2);
pMemDC->SetWindowExt(cr.right, cr.bottom);
pMemDC->SetViewportExt(cr.right, -cr.bottom);
pMemDC->MoveTo(0, 0);
pMemDC->LineTo(cr.right/2, cr.bottom/2);
pDC->BitBlt(-cr.right / 2, cr.bottom / 2, cr.right, cr.bottom, &MemDC, -cr.right / 2, cr.bottom / 2, SRCCOPY);
MemDC.SelectObject(pOldBitmap);
pWnd->ReleaseDC(pDC);
但是我在窗口中看不到我画的图形,我想是bitblt的参数没有设置对,或是前面的坐标映射的关系没有对。请各位高手指点一下,谢谢!
问题点数:20、回复次数:7Top
1 楼kmzwm(狂战士)回复于 2005-05-15 16:52:39 得分 0
你为什么要设置映射方式呢?Top
2 楼greenteanet(扎扎实实打基础,保持一颗平常心。)回复于 2005-05-15 16:59:16 得分 0
可能是画到窗口外啦..Top
3 楼owe(wsm)回复于 2005-05-15 17:02:08 得分 0
upTop
4 楼higherlin(命运与天意)回复于 2005-05-15 17:14:49 得分 0
不要用坐示映射啊!Top
5 楼xyw2278(启明星)回复于 2005-05-15 17:15:18 得分 10
// 下面是我在视图类OnDraw中完成的,奇怪的是有个问题,内存画刷的颜色什么时候变成了黑色!
CRect cr;
GetClientRect(&cr);
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC, cr.right, cr.bottom);
CBitmap* pOldBitmap = MemDC.SelectObject(&MemBitmap);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowOrg(0, 0);
pDC->SetViewportOrg(cr.right/2, cr.bottom / 2);
pDC->SetWindowExt(cr.right, cr.bottom);
pDC->SetViewportExt(cr.right, -cr.bottom);
MemDC.SetMapMode(MM_ANISOTROPIC);
MemDC.SetWindowOrg(0, 0);
MemDC.SetViewportOrg(cr.right/2, cr.bottom / 2);
MemDC.SetWindowExt(cr.right, cr.bottom);
MemDC.SetViewportExt(cr.right, -cr.bottom);
CPen pen(PS_SOLID, 1, RGB(255,0,0));
CPen *pOldPen = MemDC.SelectObject(&pen);
MemDC.MoveTo(0, 0);
MemDC.LineTo(cr.right/2, cr.bottom/2);
MemDC.SelectObject(pOldPen);
pen.DeleteObject();
//pDC->MoveTo(0, 0);
//pDC->LineTo(cr.right/2, cr.bottom/2);
pDC->BitBlt(-cr.right / 2, -cr.bottom / 2, cr.right, cr.bottom, &MemDC, -cr.right / 2, -cr.bottom / 2, SRCCOPY);
MemDC.SelectObject(pOldBitmap);
MemBitmap.DeleteObject();
MemDC.DeleteDC();Top
6 楼kmzwm(狂战士)回复于 2005-05-15 17:19:32 得分 0
想起坐标映射,我就头大!Top
7 楼lonenomad(流浪汉)回复于 2005-05-15 19:39:23 得分 10
楼主的画错了内存环境,画在MemDC中,不是pMemDC中。说白了就是画在了你选中的位图上。就象xyw2278(启明星) ( ) 那样。
MemDC.MoveTo(0, 0);
MemDC.LineTo(cr.right/2, cr.bottom/2);
MemDC.SelectObject(pOldPen);
TO:回复人: xyw2278(启明星) ( ) 信誉:115
// 下面是我在视图类OnDraw中完成的,奇怪的是有个问题,内存画刷的颜色什么时候变成了黑色
你说的是花屏吧。那是因为位图没有填充颜色。
用Memdc.FillRect(rect,&brush);Top




