您的位置:程序门 -> vc/mfc -> 图形处理/算法



画图时如何突破gdi坐标限制


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


画图时如何突破gdi坐标限制[已结贴,结贴人:rayshen]
发表于:2007-03-12 15:46:49 楼主
做了个activex用gdi绘制表格,我在测试时发现gdi坐标值实际上被限制在-32,768到32,767之间。但我要绘制的表格却有数十万行之多,如果按最大可用的坐标计算可到65536,每行按10个点计,也只能绘制6千多行,再往后的行就显示不出来了,这远远不够啊。请高手们指点一下,如何做,才能显示出数十万行的表格。另不能用分页的方法
发表于:2007-03-12 15:49:241楼 得分:10
一般的做法是设置了剪裁区域,看不到的绘制干嘛,浪费时间
发表于:2007-03-12 15:58:422楼 得分:0
//gdi坐标值限制在-32,768到32,767之间?

win32   gdi中的api可接受的是32位的整数,你如何绘制的?怎么会有这种限制?
发表于:2007-03-12 16:08:073楼 得分:0
他可能是dc   区域得错了
发表于:2007-03-12 16:14:364楼 得分:0
绘制时使用了剪裁区域,但如果向下滚动超过6千多行之后,下面绘制的表格就看不到了,在6千多行处可明显看到断层,再往下的就无法显示。

to   chehw(chehw)  
我是在activex控件中绘制时出现的,我也知道在winnt以上的系统中,坐标是可以用完整的32位值,但在activex控件中就是出现了这个限制,和win98的系统类似。
我做过测试,一般的exe程序中是可以用32位的坐标值。但在activex中就不知为什么不行。
我的测试很简单,主要代码如下:
for(int   i   =   0;   i   <   3;   ++i)
{
movetoex(hdc,   10   +   10   *   i,   0,   null);
lineto(hdc,   10   +   10   *   i,   32678   +   32678   *   i);
}
发表于:2007-03-12 21:32:105楼 得分:0
如果这样绘制有可能会出现问题,可以(也不应该)使用这么大的坐标值。
绘图时只绘制可见区域就可以了,先根据客户区大小计算出当前视图可显示的行数,再根据滚动条的位置设置取得第一个可见行对应的索引,然后从该索引开始依次显示出必要的行数。
发表于:2007-03-13 05:12:496楼 得分:0
getscrollinfo
发表于:2007-03-13 05:14:517楼 得分:10
getscrollinfo,
在windows的message机制中position数据会被截断。所以会导致这样的情况。
发表于:2007-03-13 08:50:058楼 得分:0
我在实际的程序中是只绘制可见区域的,我的测试只是为了验证坐标值是否存在限制,这个和是否只绘制可见区域无关的。如果坐标值有限制,就是使用只绘制可见区域,超过坐标限制部分的图形还是无法显示的。
我是想求一个突破限制的解决方法
发表于:2007-03-13 10:15:019楼 得分:0
如果只绘制可见区域,直接绘图不需要这么大的坐标值;如果用的是双缓冲,映射模式为mm_text,受系统内存影响,内存位图的高度会受限制,可能无法达到要求。

mm_text模式下坐标的最大值到2000就已经行大了。绘制时似乎用不到这么大的坐标值,你可以用一个long型整数记录第一个可见行的行号,每次读取新的内容,从(0,0)点开始绘图。

或用setviewportorgex设置视口原点为最新的可见行的相对位置,此时该点坐标值可视为(0,0),然后读取并绘制可见的内容。

发表于:2007-03-13 11:54:2510楼 得分:0
to   chehw(chehw)   :
有很长的(数十万行)表格要显示,用滚动条来浏览表格。我在绘制时,根据可见区域坐标,可以计算出有那些行表格需要显示,然后把要显示的部分画出来。随着滚动条的不断下翻,可见区域坐标也在不断改变,需要显示的表格也跟着变,前面一直可以正常显示,然后,向下滚动到一定位置后,再往后滚动,绘制的表格就无法显示了。从实际看,明显在某一位置处,绘制的表格被断开了,后面的全都看不到。
那个简单的测试是为了验证gdi坐标有限制而写的,可以改变画线中的y值,能看到同样的现象,在某一位置之后,无法显示。
我用setviewportorgex也试过了,一样会出现,到一定位置后就无法显示。比如设置setviewportorgex(hdc,   0,   32670,   null);
然后随便画些图形,滚动到对应位置,就可以发现实际显示的图形有被截去。

我的猜测是,在activex中,滚动条的范围是32位的,但gdi坐标的范围是16位的。我想突破gdi的限制。
发表于:2007-03-13 14:06:2511楼 得分:60
绘图时没有必要改变可见区域的坐标,在同一区域显示动态改变的新内容就可以了.

例:设置滚动条的range为(0,   总行数),   当下拉滚动条时,   先获取滚动条的位置m_npos;然后调用drawtable刷新显示区域.  

void   drawtable(hdc   hdc,   rect   rcclient)
{
      patblt(hdc,   rcclient.left,   rcclient.top,  
                        rcclient.right-rcclient.left,
                        rcclient.bottom-rcclient.top,   whiteness);
      ...
        for(i=0;i <nvisiblelines;   i++)     //   {
              rowdata   *pdata=getrowdata(m_npos);   //定位到需显示的数据
              drawline(hdc,   rcclient.left,   rcclient.top+i*cyline,   pdata);      
        }

}


发表于:2007-03-13 14:47:3512楼 得分:0
to   chehw(chehw)   :
我也想过将表格的坐标范围映射到滚动条,然后响应滚动消息进行绘制。
但不知这个方法在activex里是否能行。
还有不知在activex里怎么设置滚动条范围和响应滚动消息
发表于:2007-03-15 16:11:1013楼 得分:0
已经知道方法了。想了解的朋友可以到这看看http://community.csdn.net/expert/topic/5389/5389620.xml?temp=.9591028

谢谢各位支持


快速检索

最新资讯
热门点击