2 cppabc cppabc 于 2016.01.27 10:46 提问

MFC CScrollView 映射模式为MM_LOENGLISH 双缓冲

我想在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();
}

其中,为了窗口有滚动条,CConfigGraph的基类设为了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);
但是还是不能显示。)

3个回答

caozhy
caozhy   Ds   Rxr 2016.01.28 07:33

MM_LOENGLISH 每个逻辑单位转换为0.01英寸。 正x是在右侧;正y启用。 你的坐标画出来太小了。

cppabc
cppabc 你没仔细看我的内容吧,如果是你说的这个原因的话,不用内存DC也画不出来,同样是同样的坐标和作图操作和MM_LOENGLISH 模式,我不用内存DC的话画出来为什么是可以画出来的,给个解释!
接近 2 年之前 回复
cppabc
cppabc   2016.01.27 11:16

我上面的坐标打错了,x左边都是正值
dcMem.MoveTo(20,-20);
dcMem.LineTo(40,-100);
dcMem.LineTo(50,-200);
dcMem.LineTo(200,-500);
我试下你的方法看行不行

91program
91program   Ds   Rxr 2016.01.27 11:14

试试:DPtoLP(&point);            //将设备坐标转换为逻辑坐标

cppabc
cppabc 不行的,没用
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!