问题描述
- MFC CScrollView 映射模式为MM_LOENGLISH 双缓冲
- 我想在MFC中应用双缓存技术来消除闪烁,代码如下(为了测试,先只画了一条直线):
void CDblBufTestView::OnDraw(CDC* pDC)
{CDC dcMem;
dcMem.CreateCompatibleDC(pDC); //创建与视图的设备相兼容的内存设备
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDCrect.rightrect.bottom); //创建一个与视图兼容的位图
CBitmap* pOldBmp=dcMem.SelectObject(&bmp);dcMem.FillSolidRect(0030002000WHITE);
dcMem.MoveTo(2020);
dcMem.LineTo(40100);
dcMem.LineTo(50200);
dcMem.LineTo(200500);pDC->BitBlt(00rect.Width()rect.Height()&dcMem00SRCCOPY);
dcMem.SelectObject(pOldBmp);
dcMem.DeleteDC();
}其中,为了窗口有滚动条,CConfigGraph的基类设为了CScrollView
为设置滚动条,重写了OnInitialUpdate,如下
void CDblBufTestView::OnInitialUpdate()
{
CSize siz(200010000);
SetScrollSizes(MM_LOENGLISHsiz);
SetTimer(TIME110NULL);
}运行后不显示在OnDraw中画的直线,查看之后发现是坐标系的问题,将OnInitialUpdate函数中的MM_LOENGLISH修改为MM_TEXT即可显示出直线。
但是我想应用MM_LOENGLISH,请问应该怎么修改,才能正常显示?(我尝试过修改画直线的坐标为
dcMem.MoveTo(-20-20);
dcMem.LineTo(-40-100);
dcMem.LineTo(-50-200);
dcMem.LineTo(-200-500);
但是还是不能显示。)
解决方案
MM_LOENGLISH 每个逻辑单位转换为0.01英寸。 正x是在右侧;正y启用。 你的坐标画出来太小了。
解决方案二:
我上面的坐标打错了,x左边都是正值
dcMem.MoveTo(20-20);
dcMem.LineTo(40-100);
dcMem.LineTo(50-200);
dcMem.LineTo(200-500);
我试下你的方法看行不行
解决方案三:
试试:DPtoLP(&point);??????????? //将设备坐标转换为逻辑坐标