= 强力问题 = 关于映射模式和刷新的问题

mxm324 2009-01-08 01:59:41
问题如下:我的视图需要设定为0.1毫米为单位,并且视图要可以缩放,所以重载了OnPrepareDC,写了代码2,dbZoom是控制缩放倍数的参数,然后由于是绘图,所以用了双缓冲,在OnDraw里面写了代码1,当然还有OnEraseBkgnd返回TRUE;

这个时候问题来了,缩放倍数为1的时候,当我用其他窗口在视图上晃动的时候。没有任何问题,当我放大视图了过后,不管多少倍,视图就会在窗口拖过的某些地方得不到刷新,当视图缩小的时候就没有这个问题。

问题的原因找了一些资料,也知道了大概是由于映射转换过后,坐标在求值上会出现偏差,具体可以参看下面这个链接的倒数第三段。
http://hi.baidu.com/hcsz/blog/item/50208b543055ff1f3b29350f.html

这个人只分析了这种问题发生的情况,但是没有说发生过后的解决方法,希望大家能够帮忙看下。如果我描述得不清楚,我随时补上:)

代码1:

CDC dc;
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();

if (!pDC->IsPrinting())
{
// draw to offscreen bitmap for fast looking repaints
if (dc.CreateCompatibleDC(pDC))
{
if (bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()))
{
OnPrepareDC(&dc, NULL);
pDrawDC = &dc;

// offset origin more because bitmap is just piece of the whole drawing
dc.OffsetViewportOrg(-rect.left, -rect.top);
pOldBitmap = dc.SelectObject(&bitmap);
dc.SetBrushOrg(rect.left % 8, rect.top % 8);

// might as well clip to the same rectangle
dc.IntersectClipRect(client);
}
}
}

// paint background
CBrush brush;
if (!brush.CreateSolidBrush(RGB(192,192,192)))
return;

brush.UnrealizeObject();
pDrawDC->FillRect(client, &brush);

pDrawDC->MoveTo(0,0);
pDrawDC->LineTo(100,100);

if (pDrawDC != pDC)
{
pDC->SetViewportOrg(0, 0);
pDC->SetWindowOrg(0,0);
pDC->SetMapMode(MM_TEXT);
dc.SetViewportOrg(0, 0);
dc.SetWindowOrg(0,0);
dc.SetMapMode(MM_TEXT);
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&dc, 0, 0, SRCCOPY);
dc.SelectObject(pOldBitmap);
}

代码2:

int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);
int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);

pDC->SetMapMode(MM_ANISOTROPIC);

double dbX = 254;
double dbY = 254;
double tempX = dbX*dbZoom;
double tempY = dbY*dbZoom;
pDC->SetWindowExt(tempX,tempY);
pDC->SetViewportExt(xLogPixPerInch,yLogPixPerInch);
...全文
76 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mxm324 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 season030441 的回复:]
pDC->SetWindowExt(tempX,tempY);
pDC->SetViewportExt(xLogPixPerInch,yLogPixPerInch);
这里面的数据类型必须是int型的,double型的是无效的。

[/Quote]
坐标映射是没有问题的:)
然后我强制改成int类型的也有同样的问题,只要
tempX和tempY的值小于下面两个xLogPixPerInch,yLogPixPerInch的值的时候就会出现上述问题
mxm324 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Mackz 的回复:]
改用StretchBlt函数
[/Quote]
这个不行:)
主要出现的症状就是窗口拖过去就会留下一些边缘之类的。
season030441 2009-01-08
  • 打赏
  • 举报
回复
pDC->SetWindowExt(tempX,tempY);
pDC->SetViewportExt(xLogPixPerInch,yLogPixPerInch);
这里面的数据类型必须是int型的,double型的是无效的。
菜牛 2009-01-08
  • 打赏
  • 举报
回复
改用StretchBlt函数
mxm324 2009-01-08
  • 打赏
  • 举报
回复
- -!发帖的时候忘记填分数了。。本来是写200的。。明天加好了。。
另外自己测试了一下。。一般来说。。当我设置windowext的两个值都同时小于viewportExt的两个值的时候。刷新就会不正常。。

xViewport=(xWindow-xWinOrg)*(xViewExt/xWinExt)+xViewOrg
yViewport=(yWindow-yWinOrg)*(yViewExt/yWinExt)+yViewOrg

难道是因为红色部分为小数?或者是0?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧