ba_wang_mao 发表于 2006-12-11 19:27

窗口保存及恢复,为什么窗口最后一列无法恢复呢?

<P>XMS申请内存已解决。窗口保存及恢复,为什么窗口最后一列无法恢复呢?以下为源程序<BR><BR>int  POPUP_x1, POPUP_x2,POPUP_y1,POPUP_y1;//窗口坐标(以像素素为单位)<BR>char XMSBuffer[800];<BR>/*-----------------------------------------------------------<BR>//保存窗口映像到XMS<BR>-----------------------------------------------------------*/<BR>void _Cdecl Save_Image_XMS(void)<BR>{<BR>    int i, j;<BR>    unsigned int size;<BR>    long long_size;<BR>    unsigned long offset = 0;<BR>     char *pp;</P>
<P>    long_size = ((long)POPUP_x2-(long)POPUP_x1+1)*<BR>                ((long)POPUP_y2-(long)POPUP_y1+1);<BR>    long_size = long_size/1024+1;<BR>    size = long_size; //被窗口遮盖区域需要的KB数<BR>    if (XMS_Size() &gt; size) // 如果可XMS可用空间大于窗口区域所需的空间<BR>    {<BR>        if ((xms_window_handle = XMS_Alloc(size)) != 0) // 申请相应空间<BR>        {  <BR>          size = POPUP_x2 - POPUP_x1;<BR>            for (i = POPUP_y1 ; i &lt;= POPUP_y2 ; i++)//窗口列坐标循环<BR>            {<BR>                pp = XMSBuffer;  // 缓冲区指针指向缓冲区<BR>                for (j = POPUP_x1 ; j &lt;= POPUP_x2 ; j++) // 窗口行坐标循环<BR>                    *pp++ = getpixel(j,i);<BR>                Write_To_XMS(XMSBuffer,size,xms_window_handle,offset);//读一行后送到XMS<BR>                offset += size;<BR>            }<BR>        }<BR>}</P>
<P>/*-----------------------------------------------------------<BR>//恢复窗口映像从XMS<BR>-----------------------------------------------------------*/<BR>void _Cdecl Restore_Image_XMS(void)<BR>{<BR>    int i, j;<BR>    unsigned short size;<BR>    unsigned long offset = 0;<BR>    char *pp;</P>
<P>    for (i = POPUP_y1 ; i &lt;= POPUP_y2 ; i++)<BR>    {<BR>        size = POPUP_x2 - POPUP_x1;<BR>        Read_From_XMS(XMSBuffer,size,xms_window_handle,offset);//从XMS读一行屏幕内容到缓冲区XMSBuffer中。<BR>        offset += size;<BR>        pp = XMSBuffer;<BR>        for (j = POPUP_x1 ; j &lt;= POPUP_x2 ; j++)<BR>            putpixel(j,i,*pp++);<BR>    }<BR>    XMS_Free(xms_window_handle);//释放<BR>}<BR></P>

一笔苍穹 发表于 2006-12-13 10:05

int  POPUP_x1, POPUP_x2,<FONT color=#ff0000>POPUP_y1,POPUP_y1;//重定义了吧?<BR></FONT><FONT color=#000000>你最后一行是没恢复完还是完全没有?我觉得问题可能出在两个函数中的size = POPUP_x2 - POPUP_x1;语句上,这样计算出来的size比你实际保存的长度少1,你可以验算一下,可能是因为每条扫描线都这样少1最后导致了误差扩大。你修改一下试试看是不是这个原故。</FONT>

一笔苍穹 发表于 2006-12-13 10:06

还有,你XMS申请那问题是怎么解决的?用BC编译?

ba_wang_mao 发表于 2006-12-13 11:53

XMS内存申请成功:<BR>1、原来定义为<BR>   int size;<BR>   size = (POPUP_x2 - POPUP_x1 + 1 ) * (POPUP_y2 - POPUP_y1 +1 ) / 1024 + 1;<BR>   XMS_Alloc(size);//调用子程序分配XMS空间(以KB为单位)<BR>2、现在更改为<BR>    int size;<BR>    long long_size;<BR>    long_size = ((long)POPUP_x2-(long)POPUP_x1+1)*((long)POPUP_y2-(long)POPUP_y1+1);<BR>    long_size = long_size/1024+1;<BR>    size = long_size;<BR>    XMS_Alloc(size);//调用子程序分配XMS空间(以KB为单位)<BR>由上可知,是因为类型转换出的错。我用的是TC++3.0 for DOS<BR><BR>3、我修改为 size = POPUP_x2 - POPUP_x1+1;后,恢复窗口区域时,窗口区域反而出现乱码, 不知为什么?<BR><BR>

页: [1]

编程论坛