CScrollView类在MM_LOENGLISH模式下用双缓冲画图问题,急!!
mfc吧
全部回复
仅看楼主
level 2
xiaoqiang749 楼主
我想在MFC中应用双缓存技术来消除闪烁,代码如下(为了测试,先只画了一条直线):
void CDblBufTestView::OnDraw(CDC* pDC)
{
CDC dcMem;
dcMem.CreateCompatibleDC(pDC); //创建与视图的设备相兼容的内存设备
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC,rect.right,rect.bottom); //创建一个与视图兼容的位图
CBitmap* pOldBmp=dcMem.SelectObject(&bmp);
dcMem.FillSolidRect(0,0,3000,2000,WHITE);
dcMem.MoveTo(20,20);
dcMem.LineTo(40,100);
dcMem.LineTo(50,200);
dcMem.LineTo(200,500);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);
dcMem.SelectObject(pOldBmp);
dcMem.DeleteDC();
}
其中,为了窗口有滚动条,CDblBufTestView的基类设为了CScrollView
为设置滚动条,重写了OnInitialUpdate,如下
void CDblBufTestView::OnInitialUpdate()
{
CSize siz(2000,10000);
SetScrollSizes(MM_LOENGLISH,siz);
SetTimer(TIME1,10,NULL);
}
运行后不显示在OnDraw中画的直线,查看之后发现是坐标系的问题,将OnInitialUpdate函数中的MM_LOENGLISH修改为MM_TEXT即可显示出直线。
但是我想应用MM_LOENGLISH,请问应该怎么修改,才能正常显示?(我尝试过修改画直线的坐标为
dcMem.MoveTo(20,-20);
dcMem.LineTo(40,-100);
dcMem.LineTo(50,-200);
dcMem.LineTo(200,-500);
但是还是不能显示。)
2016年01月28日 08点01分 1
level 2
xiaoqiang749 楼主
没人会吗?!
2016年01月28日 09点01分 2
感觉你在钻牛角尖,这样模式下去绘图自找麻烦,项目会有这种需求?
2016年01月29日 03点01分
level 9
int iOldMode = pDC->SetMapMode(MM_LOENGLISH);
//设备坐标,像素/单位;
CRect rcDev;
GetClientRect(&rcDev);
//逻辑坐标,0.01英寸/单位;
CRect rcLgc;
POINT pts[2] = {rcDev.TopLeft(),rcDev.BottomRight()};
DPtoLP(pDC->m_hDC,pts,2);
rcLgc.SetRect(pts[0],pts[1]);
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap bmp;
//CreateCompatibleBitmap后两参数是以像素为单位,所以待会绘上窗口DC时需做坐标转换.
bmp.CreateCompatibleBitmap(pDC,rcDev.Width(),rcDev.Height());
dcMem.SelectObject(&bmp);
dcMem.FillSolidRect(rcDev,0xffffff);
dcMem.MoveTo(20,20);
dcMem.LineTo(40,100);
dcMem.LineTo(50,200);
dcMem.LineTo(200,500);
//注意看参数;
pDC->StretchBlt(0,0,rcLgc.Width(),rcLgc.Height(),&dcMem,0,0,rcDev.Width(),rcDev.Height(),SRCCOPY);
bmp.DeleteObject();
dcMem.DeleteDC();
pDC->SetMapMode(iOldMode);
2016年01月29日 03点01分 3
level 2
xiaoqiang749 楼主
这样和我写的有什么区别吗,你只是用了StretchBlt这个函数
2016年02月16日 02点02分 4
你还没搞清楚重点么,主要是坐标转换问题。你自己调调看不就知道了。
2016年02月16日 02点02分
1