CScrollView中画图问题

来源:互联网 发布:求主析取范式算法 编辑:程序博客网 时间:2024/05/01 04:06

问题描述:
定义继承自CScrollView的类,在该类中进行画图,出现了一些问题:
 拖动滚动条,图像部分随之移动,但是被边框覆盖过再次被拉出来后的部分没有显示了。

问题分析:

该问题出现是因为矩形框坐标设置不当。出问题的时候,准备被画的矩形坐标同当前客户区大小关联,也即是使用了 

CRect rcClient;
GetClientRect(&rcClient);
pDC->DPtoLP(&rcClient); 

const int nPading = 100;
int nLeft = rcClient.left + nPading;
int nRight = rcClient.right - nPading;
int nTop =rcClient.top - nPading;
int nBottom = nTop - 4*nPading; 
CRect rect(nLeft, nTop, nRight, nBottom);

这个时候使用rect绘制就会出现上面的问题。

解决问题:

将rect坐标同rcClient相关联的部分修改,使他们不存在联系,问题即可解决。

深入分析:

出现该问题据本人分析是绘图过程中坐标处理不当,没有理解绘图时使用的坐标系统。

绘图时涉及到了窗口window和视口view

关于这个问题的解释,在http://bbs.csdn.net/topics/10155935中

 #11 得分:0回复于: 2002-05-04 23:55:01
看上去你把输出局限在客户区的有限范围内了,但是你在rect和TextOut中使用的坐标都是相对于客户区原点的坐标,所以当你点击滚动条时,画面被更新,但原点仍在客户区的左上角,所以输出的图形与未滚动时一致。但是,当你点击滚动条时,视图向上移动了1000单位。此时,整个客户区均为无效区域,更新后的结果与初始化时相同。而当你拉动滚动块时,拉动一次,视图可能只向上移动了10单位,而此时无效区域仅为客户区下端高为10单位的矩形了,因此只有那个区域内的视图被更新了,如果你点击滚动条上的向下箭头。假设视图向上移动了100单位,则客户区下方的高为100,宽为客户区宽度的矩形内显示的是初始化时的内容,而其上的内容好像被抬高了100单位。这是因为OnVScroll中通过ScrollWindow将原客户区中的内容移动指定距离,而将因移动出现的空白指定为无效区域,而只有无效区域才会得到更新,因而,出现花屏。

问题说的我认为是对的。

 

对于画图闪屏的问题,有一种双缓冲的方法可以解决

在http://blog.csdn.net/jiangdf/article/details/7234562中有较为好的说明,尤其是这篇文章中说明了设备坐标和逻辑坐标