基于CScrollView的CMyView在滚动时出现花屏(乱码)????

sterding 2002-05-03 11:12:57
1、我在基于CScrollView的CMyView1的OnPaint()中画图,运行能显示,但是滚动滑动条就出现显示不完整的花屏(乱码),如何解决????

2、我在基于CScrollView的CMyView1的OnDraw()中写字(textout),运行,有的时候能显示,有的时候不显示,需要滚动一下滑条才可以显示,为什么???

...全文
254 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Suncanoe 2002-07-02
  • 打赏
  • 举报
回复
http://www.vckbase.com/study/article/vc_chap/chap7_3.htm
sterding 2002-05-06
  • 打赏
  • 举报
回复
结帐吧
Hover 2002-05-05
  • 打赏
  • 举报
回复
这里应改为
void CMyScrollView::OnInitialUpdate()
{
CSize sizeTotal;
sizeTotal.cx = sizeTotal.cy = 10000;
SetScrollSizes(MM_TEXT, sizeTotal); CScrollView::OnInitialUpdate();
}
shawn_liu 2002-05-05
  • 打赏
  • 举报
回复
抱歉,上面的话逻辑混乱了点,有的地方用词有错误,不知你明白吗?
sterding 2002-05-05
  • 打赏
  • 举报
回复
请教quanxiongwei(毛毛熊):

除了你在上面提到的一点之外,OnDraw和OnPaint究竟有哪些不同呢?能不能给点意见?譬如在消息调用上,在某些基本视图的更新调用上,etc
sterding 2002-05-05
  • 打赏
  • 举报
回复
早晨一来,看到这么多热心的跟帖,很是感动,相信今天又会是一个心情愉快的周末!谢谢各位,谢谢!

TO DavidHowe() :
你的意见虽短,但很到位。应该是“根据当前滚动条的位置来进行坐标修正”,确定需要更新的最小区域,这也是一种提高效率的办法。但我的问题不在于此。(LL,你的方法就是这个思想!)

TO shawn_liu():
谢谢你写了那么多中肯的意见。你将问题的现象得十分地透彻,我全部看懂了!

TO quanxiongwei(毛毛熊) :
十分感谢你的解决办法!有一种似曾相识、恍然顿悟的感觉(笨)。
/*不过在CSrollView中的OnPaint中画图不是一个好习惯,记住:
Do not call CScrollView::OnPaint() for painting messages
改在OnDraw里面画图吧。*/谢谢你的意见!

对于第二个问题,我会给出出错代码!谢谢关注!
quanxiongwei 2002-05-05
  • 打赏
  • 举报
回复
忘了说一点了,是不是你的TextOut(x,y,str)中x,y的坐标值正好处于当前窗口的客户区坐标的边界值上,窗口缩小了一点点则需要滚动滚动条才能看到字体。
quanxiongwei 2002-05-05
  • 打赏
  • 举报
回复
第一个问题,解决方法是在CPaintDC dc(this)后加入OnPrepareDC(&dc)。
不过在CSrollView中的OnPaint中画图不是一个好习惯,记住:
Do not call CScrollView::OnPaint() for painting messages
改在OnDraw里面画图吧。
第二个问题,我找不出原因,所以专门测试了一下。我试了n下,都没有出现
你说的情况,我也帮不了你。
quanxiongwei 2002-05-05
  • 打赏
  • 举报
回复
先回答你的第一个问题.
在使用CScrollView时应该注意:
如果在视图中OnDraw函数之外绘制输出,就要调用CScrollView::OnPrepareDC
让MFC在输出中考虑影射模式和滚动位置的影响。CScrollView的设计思路是你
编写的OnDraw程序不必以直接的方式考虑滚动位置的处理,但是在OnPaint就需要。以下是CScrollView从CView继承来的OnPaint处理程序:
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
在调用OnDraw之前,CView::OnPaint会调用虚OnPrepareDC函数。
Hover 2002-05-04
  • 打赏
  • 举报
回复
扰乱视听
xb4270293 2002-05-04
  • 打赏
  • 举报
回复
如果视图用于编辑文字,应该使用CRichEditView,工作都交给MFC去做。
文档驱动视图更新,即将文档中修改了的变量,反映到视图中可使用UpdateAllViews(NULL)
shawn_liu 2002-05-04
  • 打赏
  • 举报
回复
OnPaint中输出的是整个文档还是其中的一部分。
shawn_liu 2002-05-04
  • 打赏
  • 举报
回复
看上去你把输出局限在客户区的有限范围内了,但是你在rect和TextOut中使用的坐标都是相对于客户区原点的坐标,所以当你点击滚动条时,画面被更新,但原点仍在客户区的左上角,所以输出的图形与未滚动时一致。但是,当你点击滚动条时,视图向上移动了1000单位。此时,整个客户区均为无效区域,更新后的结果与初始化时相同。而当你拉动滚动块时,拉动一次,视图可能只向上移动了10单位,而此时无效区域仅为客户区下端高为10单位的矩形了,因此只有那个区域内的视图被更新了,如果你点击滚动条上的向下箭头。假设视图向上移动了100单位,则客户区下方的高为100,宽为客户区宽度的矩形内显示的是初始化时的内容,而其上的内容好像被抬高了100单位。这是因为OnVScroll中通过ScrollWindow将原客户区中的内容移动指定距离,而将因移动出现的空白指定为无效区域,而只有无效区域才会得到更新,因而,出现花屏。
DavidHowe 2002-05-04
  • 打赏
  • 举报
回复
我想你在绘图时要考虑根据当前滚动条的位置来进行坐标修正。
sterding 2002-05-04
  • 打赏
  • 举报
回复
大家用向导生成一个基于CScrollView的SDI,只将修改下面两个函数(先要用类向导添加)即可,运行正常,你会发现滚动滑条时视图显示不完整了!能帮个忙吗?谢谢any insight will be grateful!
void CMyScrollView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();

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

void CMyScrollView::OnPaint()
{
CPaintDC dc(this); // device context for painting

CRect rect;
GetClientRect(&rect );
int Width=rect.Width();

int m_nWidthBrush=15;

CBrush brush;
brush.CreateSolidBrush(RGB(255,0,0));
CBrush *pOldBrush=dc.SelectObject(&brush);

int L_edge=int(0.1*Width);
int R_edge=int(0.1*Width);
int W_centre=int(0.8*Width);

for(int lIndex=0;lIndex<100;lIndex++)
{
int x=0,y=2+lIndex*m_nWidthBrush;

CString s_index;
s_index.Format("%-8d",lIndex);
dc.TextOut(0,y,s_index);

CRect rect(L_edge,y,L_edge+W_centre,y+m_nWidthBrush);
dc.FillRect(rect,&brush);

s_index.Format("%8d",lIndex++);
dc.TextOut(L_edge + W_centre,y,s_index);
}
dc.SelectObject(pOldBrush);
}


Hover 2002-05-03
  • 打赏
  • 举报
回复
1.你有没考虑过逻辑坐标的问题?

2.处理滚动栏消息,每一次的滚动消息中更新视.
hww02 2002-05-03
  • 打赏
  • 举报
回复
没遇见。
shawn_liu 2002-05-03
  • 打赏
  • 举报
回复
那要看你的代码了。
sterding 2002-05-03
  • 打赏
  • 举报
回复
怎么更新?
shawn_liu 2002-05-03
  • 打赏
  • 举报
回复
我想,应该是你的视图没有及时更新你在文档中所作的改变的问题吧。

16,551

社区成员

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

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

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