📄 如何理解cscrollview中的滚动条及视图处理,请各位帮忙解答几个小问题.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<!-- saved from url=(0057)http://www.ask-expert.cn/html/yongliang/200611/43022.html -->
<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>如何理解CScrollView中的滚动条及视图处理,请各位帮忙解答几个小问题</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content=如何理解CScrollView中的滚动条及视图处理,请各位帮忙解答几个小问题 name=description>
<META content=如何理解CScrollView中的滚动条及视图处理,请各位帮忙解答几个小问题 name=keywords><LINK
media=all href="如何理解CScrollView中的滚动条及视图处理,请各位帮忙解答几个小问题.files/css.css"
type=text/css rel=stylesheet>
<META content="MSHTML 6.00.2900.3132" name=GENERATOR></HEAD>
<BODY>
<DIV id=left>
<H5 align=center>文章搜索</H5>
<FORM name=searchform action=/plus/search.php>
<DIV align=center><INPUT id=keyword size=12 name=keyword> <INPUT type=submit value=搜索 name=submit> <INPUT id=field type=hidden value=Title
name=Field> <BR></DIV></FORM>
<HR>
<LI><A title=问专家 href="http://www.ask-expert.cn/">首页</A>
<LI><A title=杨勇 href="http://www.ask-expert.cn/html/yangyong/index.html">杨勇</A>
<LI><A title=李鑫 href="http://www.ask-expert.cn/html/liqin/index.html">李鑫</A>
<LI><A title=赖勇良
href="http://www.ask-expert.cn/html/yongliang/index.html">赖勇良</A>
<LI><A title=甘玲 href="http://www.ask-expert.cn/html/ganling/index.html">甘玲</A>
<LI><A title=胡海 href="http://www.ask-expert.cn/html/huhai/index.html">胡海</A>
<LI><A title=霍东 href="http://www.ask-expert.cn/html/huodong/index.html">霍东</A>
<LI><A title=左琴 href="http://www.ask-expert.cn/html/zuoqin/index.html">左琴</A>
<LI><A title=刘文安
href="http://www.ask-expert.cn/html/liuwenan/index.html">刘文安</A>
<LI><A title=梁文通
href="http://www.ask-expert.cn/html/liangwentong/index.html">梁文通</A>
<LI><A title=黄宏 href="http://www.ask-expert.cn/html/huanghong/index.html">黄宏</A>
<LI><A href="http://www.ask-expert.cn/special/index.php">专题</A>
<HR>
<BR><BR><BR></LI></DIV>
<DIV id=right>当前位置:<A href="http://www.ask-expert.cn/">主页</A>><A
href="http://www.ask-expert.cn/html/yongliang/index.html">赖勇良</A>>
<B>如何理解CScrollView中的滚动条及视图处理,请各位帮忙解答几个小问题</B>
<H1>如何理解CScrollView中的滚动条及视图处理,请各位帮忙解答几个小问题</H1>
<DIV id=newsadl>
<SCRIPT type=text/javascript><!--
google_ad_client = "pub-0610001303125404";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--></SCRIPT>
<SCRIPT src="如何理解CScrollView中的滚动条及视图处理,请各位帮忙解答几个小问题.files/show_ads.js"
type=text/javascript>
</SCRIPT>
</DIV>
<DIV id=newsadr>
<SCRIPT type=text/javascript><!--
google_ad_client = "pub-0610001303125404";
google_ad_width = 160;
google_ad_height = 600;
google_ad_format = "160x600_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
</SCRIPT>
<SCRIPT src="如何理解CScrollView中的滚动条及视图处理,请各位帮忙解答几个小问题.files/show_ads.js"
type=text/javascript>
</SCRIPT>
</DIV>
<DIV id=content>
<DIV id=innerContent>
<DIV class=author><A class=anchor name=Top>楼主</A>coolwin11(鹰之歌)2005-06-06
15:23:14 在 VC/MFC / 界面 提问</DIV>
<P>理解CScrollView中的滚动条及视图处理 <BR> <BR> 主要有两个问题请教:
一是关于OnScroll函数,二是关于OnDraw函数。 <BR>
从MFC/src/ViewScrl.cpp的代码中了解到有以下调用: <BR> OnScroll调用
<BR> OnScrollBy() <BR> UpdateWindow() <BR>
OnscrollBy调用 <BR> ScrollWindow() <BR>
可以明确,ScrollWindow在UpdateWindow之前被调用. <BR>
据我猜测,ScrollWindow中应该是调用了SetViewportOrg设置了视图的原点。 <BR>
1.请问在ScrollWindow函数里,是否对视图内容进行了滚动?同时又调用了InvalidateRect设置了新出现的区域为无效区域?是否会发送WM_PAINT消息?
<BR> (比如滚动了一行,是否将视图内容整体上移了一行,并留下最末新增的行等待更新) <BR>
2.UpdateWindow是否又再一次发送了WM_PAINT消息? <BR> <BR>
在处理WM_PAINT消息的OnPaint函数中,有一个必须存在的定义就是CPaintDC dc(this), <BR>
3.dc是直接指向视图的客户区还是仅是一个兼容的副本? <BR> 4.在处理WM_PAINT时是否OnDraw每次都会被调用?
<BR> 5.关于无效区域,例上移了一行,设置了InvalidateRect为最末新增的一行,那么裁剪是怎么操作的?
<BR> 和OnDraw又是怎样一个先后关系? <BR> 还有几个后续问题,需要知道以上的答案才好提出来,请高手帮帮忙。
<BR> <SPAN>问题点数:100、回复次数:8</SPAN> </P>
<H3><STRONG><A class=anchor name=r_29920185>1
楼</A>krh2001(边城浪子)</STRONG><SPAN>回复于 2005-06-06 15:41:13 得分
<EM>50</EM></SPAN></H3>
<P>1) ScrollWindow API 函数本身就可以产生无效区域. 不用手工调用
<BR> 2) UpdateWindow 会向窗口发送 WM_PAINT
消息(如果无效化区域不为空), <BR> CPaintDC dc,构造器初始化Paint
DC, 析构时结束Paint,这是必需的,否则你应该手工调用 BeginPaint 和EndPaint.
<BR> 3) dc 指的是客户区, 屏幕 <BR> 4)
WM_PAINT 消息处理函数内, 创建 CPaintDC, 调整DC 坐标系,然后
调用 OnDraw 所以每次 Paint 都会调用. <BR>
5) InvalidateRect 将一个矩形加到窗口的无效区域内, 当BeginPaint
的时候, 此窗口的无效区域被指定给 DC. DC会对位于 区域之外的绘图进行剪裁.
剪裁操作是内部进行的,我想它有一套规则来判断绘制的图形的某些像素是不是位于剪裁区域外, 这些像素将不会被实际输出.
<BR> <BR> P.S. OnScroll,
OnScrollBy 楼主的理解是不对的</P>
<H3><STRONG><A class=anchor name=r_29921557>2
楼</A>coolwin11(鹰之歌)</STRONG><SPAN>回复于 2005-06-06 16:36:07 得分 0 </SPAN></H3>
<P>To krh2001(边城浪子) <BR>
关于OnScroll和OnScrollBy,我是看了MFC中这两个函数的代码,OnScroll调用了OnScrollBy()和UpdateWindow(),OnscrollBy调用了ScrollWindow().
<BR>
对于裁剪我现在基本清楚了,但UpdateWindow()和ScrollWindow()是不是都触发了WM_PAINT还是应该有其它的理解?
<BR> <BR> 我还遇到这样的问题: <BR>
当TreeView中改变了选择的条目后,更新文档结构中的某个变量并调用UpdateAllViews(this),而在另外一个View中的OnUpdate函数里,读取了变量新的值并对视图重新绘制。可视图的内容根本没有变,需要切换一下窗口才会出现。于是我在OnUpdate最后加入了Invalidate函数就可以了,这样做正确么?
<BR> <BR>
其实我想编一个十六进制编辑框,左边是十六进制,右边是ASCII码,并且在最上面有一个固定的标题栏,可每次滚动条移动不到一页,这个标题栏就没了,切换一下就又出现了。不知怎么解决?</P>
<H3><STRONG><A class=anchor name=r_29923158>3
楼</A>coolwin11(鹰之歌)</STRONG><SPAN>回复于 2005-06-06 17:33:00 得分 0 </SPAN></H3>
<P>自己顶一下</P>
<H3><STRONG><A class=anchor name=r_29929859>4
楼</A>coolwin11(鹰之歌)</STRONG><SPAN>回复于 2005-06-07 08:22:59 得分 0 </SPAN></H3>
<P>再顶</P>
<H3><STRONG><A class=anchor name=r_29930054>5 楼</A>laiyiling(Graphics ◎
Multimedia)</STRONG><SPAN>回复于 2005-06-07 08:32:32 得分 <EM>50</EM></SPAN></H3>
<P>是可以用Invalidate函数更新视图的。 <BR> <BR>
ScrollWindow()函数实际上是用位图拷贝实现的.ScrollWindowEx()执行的操作流程是先将位图块在屏幕DC上移动(硬件操作),然后对新暴露出的区域发送WM_ERASEBKGND(可选)并对该窗口设置新的无效区域(你在WM_PAINT中可以得到这个区域)。</P>
<H3><STRONG><A class=anchor name=r_29930069>6 楼</A>laiyiling(Graphics ◎
Multimedia)</STRONG><SPAN>回复于 2005-06-07 08:33:31 得分 0 </SPAN></H3>
<P>这个说明如何 <BR> <BR> void ScrollWindow(
int xAmount, int yAmount, LPCRECT lpRect
= NULL,LPCRECT lpClipRect = NULL );
<BR> <BR> 参数 <BR>
xAmount指定了水平滚动的量,使用设备单位。在左滚时,该参数必须为负。 <BR>
yAmount指定了垂直滚动的量,使用设备单位。在上滚时,该参数必须为负。 <BR>
lpRect指向一个CRect对象或RECT结构,指定了要滚动的客户区的部分。如果lpRect为NULL,则将滚动整个客户区。如果光标区域与滚动矩形重叠,则插字符将被重定位。
<BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -