📄 subject_42356.htm
字号:
<p>
序号:42356 发表者:chenyouyuan 发表日期:2003-06-02 20:23:08
<br>主题:一个视图和文档的问题,请各位大哥帮助一下!很具挑战性哦!(200分)
<br>内容:先把大意说一遍:偶有5万行的数据(直角坐标系下的一个点)需要显示出来,因此建立一个文档和两个与之相关的视图,一个用于显示数据,另一个用于显示图像(显示各个点,还没有做,先不管)。现在在显示数据者一块遇到了拦路虎,想高分向各位高手求教!<BR>我先把问题简化一下:<BR>1、首先初始化文档数据,如下:<BR>点的定义:三个整型变量x,y,z<BR>class Point:public CObject<BR>{<BR>public:<BR> int x,y,z;<BR>};<BR>文档数据成员:<BR>class CMy2Doc:public CDocment<BR>{<BR>public:<BR>CArray<Point,Point&>point;<BR>};<BR>初始化文档:<BR>BOOL CMy2Doc::OnNewDocument()<BR>{<BR> if (!CDocument::OnNewDocument())<BR> return FALSE;<BR> point.SetSize(5000,5);<BR> for(int i=0;i<point.GetSize();i++)<BR> {<BR> point[i].x=i;<BR> point[i].y=i;<BR> point[i].z=i;<BR> } <BR> return TRUE;<BR>}<BR>2、View类的OnDraw函数:<BR>void Cmy2View::OnDraw(CDC* pDC)<BR>{<BR> CMy2Doc* pDoc = (CMy2Doc*)GetDocument();<BR> // TODO: add draw code here<BR> int ppx=30;<BR> int ppy=20;<BR> for(int i=0;i<pDoc->point.GetSize();i++,ppy+=15)<BR> {<BR> CString str;<BR> str.Format("%d %d %d",pDoc->point[i].x,<BR> pDoc->point[i].y,pDoc->point[i].z);<BR> pDC->TextOut(ppx,ppy,str,str.GetLength());<BR> }<BR>}<BR>3、运行结果是:开始显示<BR>0 0 0<BR>。。。。<BR>等,然后抖动一下就是显示成下面的形式了:<BR>4368 4368 4368<BR>4369 4369 4369<BR>4370 4370 4370 <BR>4371 4371 4371 <BR>4372 4372 4372 <BR>4373 4373 4373<BR>。。。。。。 <BR>本人百思不得其解,然后改动了一下,就是在初始化是改写了<BR>point.SetSize(5000,5)函数,把他改成了point.SetSize(4000,5);<BR>由原来的5000个点数据改成了4000个点数据,然后又显示正常了(我认为是),如下:<BR>0 0 0<BR>1 1 1<BR>2 2 2<BR>3 3 3<BR>。。。。。<BR>请问<BR>(1)这是什么原因造成的,4000和5000有区别吗?<BR>(2)我想用CSrollView视图来实现滚动,但是数据超出一定值后(比如超出2000,不具体)效果很不理想,也出现上面的情况,总不是从第一个数据开始,这个地方我还不会,请各位大哥帮帮忙!详细指点一番!<BR>(3)在滚动视图中通常用到这么几句话:<BR>void CMy2View::OnInitialUpdate() <BR>{<BR> CScrollView::OnInitialUpdate();<BR> // TODO: Add your specialized code here and/or call the base class<BR> // TODO: calculate the total size of this view<BR> <BR> CSize sizeTotal(800,420000);<BR> CSize sizePage(sizeTotal.cx,600);<BR> CSize sizeLine(sizeTotal.cx,100);<BR> SetScrollSizes(MM_TEXT,sizeTotal,sizePage,sizeLine);<BR>}<BR>请问这几句话具体意义是什么啊?上面的420000有限度吗?可不可以无限大呢?比如100000000000?每一页的sizePage中的600与420000有什么关联吗?<BR><BR>哪位大哥帮我解决这些疑问,不胜感激!我出200分以资酬谢,如果解释详细,具体解决了问题,我还可以再给200分!谢谢啦!很急啊!<BR>我很菜,希望能给出详细解答!谢谢!谢谢!
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:chenyouyuan 回复日期:2003-06-02 20:33:02
<br>内容:还有第四个问题:<BR>(4)我听别人说,在设置视图大小时,可以动态的根据文档的大小来进行设置,而不是向上面那样(CSize sizeTotal(800,420000)),所有的都不变,请问怎样得到文档的大小?具体给怎么做?谢谢!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:信笺 回复日期:2003-06-02 22:01:55
<br>内容:我也是个菜鸟,只知道一部分,做答如下。<BR>void CMy2View::OnInitialUpdate() <BR>{<BR> CSize sizeTotal(800,420000);//设置ScrollView页面总的大小;<BR> CSize sizePage(sizeTotal.cx,600);//按page up,page down时<BR> //页面移动600单位(具体<BR> //单位不知,也许是象<BR> //素);<BR> CSize sizeLine(sizeTotal.cx,100);//点滚动条上下箭头时页面<BR> //移动100单位。<BR>}<BR>第一次发言,见笑了。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:信笺 回复日期:2003-06-02 22:23:17
<br>内容:我试了你的代码,一点问题也没有啊,显示<BR>0 0 0<BR>1 1 1<BR>2 2 2<BR>3 3 3<BR>。。。。<BR>30 30 30<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:chenyouyuan 回复日期:2003-06-03 20:47:35
<br>内容:信笺兄:<BR> 你再试一试呢,你把4000改成40000呢?你怎么办?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:chenyouyuan 回复日期:2003-06-03 21:05:52
<br>内容:埃,回帖的人太少了,高手太少了!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:信笺 回复日期:2003-06-04 13:50:26
<br>内容:40000也可以显示啊,<BR>另外关于scroll view可以看看<BR>http://www.vckbase.com/study/article/vc_chap/chap7_3.htm
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:chenyouyuan 回复日期:2003-06-05 20:24:10
<br>内容:谢谢你的回复!感激不尽!<BR>问题解决了,我的程序确实没有问题。毛病在这里:<BR>是这样的,我的机子装的是windows98系统,里面的逻辑坐标是用16位来表示的,所以是有限的;而到了windows NT后,里面的逻辑坐标是用32位表示的,因此逻辑坐标几乎是无限的!我想你装的系统一定是win2000或更高!所以在执行时没有问题!这个我已经在2000里试过了,完全没有问题。谢谢你这么热心解答问题。也正是你说程序没有错,才促使我去想这些问题。谢谢!<BR>我想这里的高手太少了,或者说这里的高手不愿解答像我们这样的菜鸟提出的愚蠢的问题。其实我到认为,只有我们这些菜鸟才去积极的探讨一些问题,勇于去探讨一些问题,而那些所谓的高手只会指手画脚,真正能解决问题的却不多,给出的建议往往没什么用,因为他们不去实践,因为他们自以为很懂,不必去实践。所以我希望到是我们这些菜鸟以后多多讨论,多多交流,把这个论坛整起来,也希望能做个朋友。<BR>对于第四个问题,我还没有找到相应的资料,不知道你是否知到这方面的内容?谢谢!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:信笺 回复日期:2003-06-05 21:48:00
<br>内容:谢谢你对我答案的认可,<BR>关于第四个问题我看可能要用到CDC::GetTextMetrics()函数,<BR>具体的用法可以查一下GOOGLE或MSDN。下面抄一小段代码:<BR>void CMyView::OnDraw(CDC* pDC)<BR>{<BR> CMyDoc* pDoc=GetDocument();<BR> ASSERT_VALID(pDoc);<BR> int i,j,nHeight;<BR> TEXTMETRIC tm;<BR> pDC->GetTextMetrics(&tm);<BR> nHeight=tm.tmHeight+tm.tmExternalLeading;<BR> j=pDoc->point.GetSize();<BR> for(i=0;i<j;i++)<BR> {<BR> //pDC->TextOut(10,i*nHeight,pDoc->ponit);<BR> }<BR>}<BR><BR>由此猜想,利用nHeight可以知道TextOut每行显示的高度,这样就可以计算出总的文档的高度了。是不是这样我也不确定,<BR><BR>PS:对高手我们要尊敬,他们可能因为忙或别的什么原因不回答问题但这个网站本来就是高手办的,在这里真的学了很多。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -