标题:窗口保存及恢复,为什么窗口最后一列无法恢复呢?
只看楼主
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
 问题点数:0 回复次数:3 
窗口保存及恢复,为什么窗口最后一列无法恢复呢?

XMS申请内存已解决。窗口保存及恢复,为什么窗口最后一列无法恢复呢?以下为源程序

int POPUP_x1, POPUP_x2,POPUP_y1,POPUP_y1;//窗口坐标(以像素素为单位)
char XMSBuffer[800];
/*-----------------------------------------------------------
//保存窗口映像到XMS
-----------------------------------------------------------*/
void _Cdecl Save_Image_XMS(void)
{
int i, j;
unsigned int size;
long long_size;
unsigned long offset = 0;
char *pp;

long_size = ((long)POPUP_x2-(long)POPUP_x1+1)*
((long)POPUP_y2-(long)POPUP_y1+1);
long_size = long_size/1024+1;
size = long_size; //被窗口遮盖区域需要的KB数
if (XMS_Size() > size) // 如果可XMS可用空间大于窗口区域所需的空间
{
if ((xms_window_handle = XMS_Alloc(size)) != 0) // 申请相应空间
{  
size = POPUP_x2 - POPUP_x1;
for (i = POPUP_y1 ; i <= POPUP_y2 ; i++)//窗口列坐标循环
{
pp = XMSBuffer; // 缓冲区指针指向缓冲区
for (j = POPUP_x1 ; j <= POPUP_x2 ; j++) // 窗口行坐标循环
*pp++ = getpixel(j,i);
Write_To_XMS(XMSBuffer,size,xms_window_handle,offset);//读一行后送到XMS
offset += size;
}
}
}

/*-----------------------------------------------------------
//恢复窗口映像从XMS
-----------------------------------------------------------*/
void _Cdecl Restore_Image_XMS(void)
{
int i, j;
unsigned short size;
unsigned long offset = 0;
char *pp;

for (i = POPUP_y1 ; i <= POPUP_y2 ; i++)
{
size = POPUP_x2 - POPUP_x1;
Read_From_XMS(XMSBuffer,size,xms_window_handle,offset);//从XMS读一行屏幕内容到缓冲区XMSBuffer中。
offset += size;
pp = XMSBuffer;
for (j = POPUP_x1 ; j <= POPUP_x2 ; j++)
putpixel(j,i,*pp++);
}
XMS_Free(xms_window_handle);//释放
}

搜索更多相关主题的帖子: 窗口 内存 POPUP int XMS 
2006-12-11 19:27
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 
int POPUP_x1, POPUP_x2,POPUP_y1,POPUP_y1;//重定义了吧?
你最后一行是没恢复完还是完全没有?我觉得问题可能出在两个函数中的size = POPUP_x2 - POPUP_x1;语句上,这样计算出来的size比你实际保存的长度少1,你可以验算一下,可能是因为每条扫描线都这样少1最后导致了误差扩大。你修改一下试试看是不是这个原故。
2006-12-13 10:05
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 
还有,你XMS申请那问题是怎么解决的?用BC编译?
2006-12-13 10:06
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
得分:0 
XMS内存申请成功:
1、原来定义为
int size;
size = (POPUP_x2 - POPUP_x1 + 1 ) * (POPUP_y2 - POPUP_y1 +1 ) / 1024 + 1;
XMS_Alloc(size);//调用子程序分配XMS空间(以KB为单位)
2、现在更改为
int size;
long long_size;
long_size = ((long)POPUP_x2-(long)POPUP_x1+1)*((long)POPUP_y2-(long)POPUP_y1+1);
long_size = long_size/1024+1;
size = long_size;
XMS_Alloc(size);//调用子程序分配XMS空间(以KB为单位)
由上可知,是因为类型转换出的错。我用的是TC++3.0 for DOS

3、我修改为 size = POPUP_x2 - POPUP_x1+1;后,恢复窗口区域时,窗口区域反而出现乱码, 不知为什么?


多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2006-12-13 11:53



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-108872-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.775500 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved