求助:在视图类中用OnDraw显示图像时,每次更新时,为何有部分图像并没有更新?

fengbingchun
博客专家认证
2011-07-25 09:25:58
在对话框中显示图像,用ScrollView实现,用OnDraw来绘图,当用Invalidate(false),来实现重绘时,为何有时图像并没有完全被更新,即上次显示的图像并没有完全被覆盖,有部分图像仍然显示的是上次的图像,而不是更新后的新图像。为什么会出现这种情况呢?该如何解决?
望高手指点,谢谢!
...全文
162 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐鹦鹉 2011-07-25
  • 打赏
  • 举报
回复
无码无真相
无图无真相
fengbingchun 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zjut018 的回复:]
应该是坐标问题!
[/Quote]

会是坐标问题吗?说说原因吧,谢谢!
zjut018 2011-07-25
  • 打赏
  • 举报
回复
应该是坐标问题!
fengbingchun 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 csharp_xinbing 的回复:]
你是说拖动滚动条之后吗?
[/Quote]

当滚动条在某个中间部位时,并没有拖到时,这时重绘图像,会出现这种情况。
CSharp_XinBing 2011-07-25
  • 打赏
  • 举报
回复
你是说拖动滚动条之后吗?
fengbingchun 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 machh 的回复:]
你可以网上搜索, 双缓存, 是怎么回事/.
[/Quote]
谢谢!我应用双缓存了,拖到图像时并没有闪屏。只是更新后新图像没有完全覆盖旧图像。
lcyw 2011-07-25
  • 打赏
  • 举报
回复
你可以网上搜索, 双缓存, 是怎么回事/.
fengbingchun 2011-07-25
  • 打赏
  • 举报
回复
在基于单文档应用程序中显示图像时,有时也会出现这种情况。到底是什么原因呢?
望高手指点,谢谢!
fengbingchun 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 ndy_w 的回复:]
图片看不见。
建议SetScrollSizes在初始化和改变zoom的时候调用,ondraw里仅仅画图。
[/Quote]

谢谢你,按你说的确实不出现部分更新的情况了。放大或者缩小时能不能以上一次显示的图像的中心为中心重新显示图像呢。现在发现当放大或缩小时,上次显示的部分有时会完全看不见了。
fengbingchun 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 ndy_w 的回复:]
图片看不见。
建议SetScrollSizes在初始化和改变zoom的时候调用,ondraw里仅仅画图。
[/Quote]

谢谢你!
我按你说的试试看。
fengbingchun 2011-07-25
  • 打赏
  • 举报
回复
为何图像不能显示呢?再试一次。
http://hi.csdn.net/space-623608-do-album-picid-867043.html,这是图像地址
ndy_w 2011-07-25
  • 打赏
  • 举报
回复
图片看不见。
建议SetScrollSizes在初始化和改变zoom的时候调用,ondraw里仅仅画图。
fengbingchun 2011-07-25
  • 打赏
  • 举报
回复
fengbingchun 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 ndy_w 的回复:]
...SetScrollSizes个应该是在OnInitialUpdate里用的啊!OnDraw里不管滚动的。
[/Quote]

void CMyView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();

CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}

这是OnInitialUpdate的函数,我没有改动过。
fengbingchun 2011-07-25
  • 打赏
  • 举报
回复
void CMyView::OnDraw(CDC* pDC)
{
//CDocument* pDoc = GetDocument();
// TODO: add draw code here
// 使用内存DC,解决闪烁问题
CMemDC *pMemDC = NULL;
pDC = pMemDC = new CMemDC(pDC);

CxImage *ima = g_image;

CSize picsize;
if(ima)
{
double zoom = g_ZoomFactor;
if (zoom==1)
{
picsize.cx = ima->GetWidth();
picsize.cy = ima->GetHeight();
SetScrollSizes(MM_TEXT,picsize);
ima->Draw(pDC->GetSafeHdc());
}
else
{
picsize.cx = ima->GetWidth()*zoom;
picsize.cy = ima->GetHeight()*zoom;
SetScrollSizes(MM_TEXT,picsize);
ima->Draw(pDC->GetSafeHdc(),CRect(0,0,(int)(ima->GetWidth()*zoom),(int)(ima->GetHeight()*zoom) ),0);
}

delete pMemDC;
//pMemDC = NULL;
}
}

这是OnDraw函数的代码,仿照的是Cximage里的OnDraw代码
ndy_w 2011-07-25
  • 打赏
  • 举报
回复
...SetScrollSizes个应该是在OnInitialUpdate里用的啊!OnDraw里不管滚动的。
fengbingchun 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ndy_w 的回复:]
仍然是有时不会全部更新
--------------------
不知道你如何判断的。如果最小化再还原后图像变了,那么应该是你的InvalidateRect区域不对。如果是InvalidateRect,应该是整个重画的,不应该出现这样的情况。
如果调用了ScrollToPosition,而参数不对,可能出现类似错位之类症状,不知你说的没更新是什么样的。
[/Quote]

也没有用到ScrollToPosition这个函数,只在OnDraw函数里用了SetScrollSizes函数。
fengbingchun 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ndy_w 的回复:]
仍然是有时不会全部更新
--------------------
不知道你如何判断的。如果最小化再还原后图像变了,那么应该是你的InvalidateRect区域不对。如果是InvalidateRect,应该是整个重画的,不应该出现这样的情况。
如果调用了ScrollToPosition,而参数不对,可能出现类似错位之类症状,不知你说的没更新是什么样的。
[/Quote]

谢谢你!
我没有用到InvalidateRect函数。
void CMyView::OnZoomIn()
{
Invalidate(false);
}
视图类里通过这个函数实现重画的。
没更新的部分,有时可能是白色背景,有时可能是上次显示的图像。
ndy_w 2011-07-25
  • 打赏
  • 举报
回复
仍然是有时不会全部更新
--------------------
不知道你如何判断的。如果最小化再还原后图像变了,那么应该是你的InvalidateRect区域不对。如果是InvalidateRect,应该是整个重画的,不应该出现这样的情况。
如果调用了ScrollToPosition,而参数不对,可能出现类似错位之类症状,不知你说的没更新是什么样的。
fengbingchun 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ndy_w 的回复:]
Invalidate后调用UpdateWindow
[/Quote]

在InValidate(false);后添加了UpdateWindow()函数,仍然是有时不会全部更新。
加载更多回复(5)

16,473

社区成员

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

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

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