| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1127 人关注过本帖
标题:800X600图形模式 窗口的保存及恢复屏幕窗口
只看楼主 加入收藏
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
 问题点数:0 回复次数:8 
800X600图形模式 窗口的保存及恢复屏幕窗口

版主:
图形模式800X600下我想实现,当窗口弹出前保存窗口内容到XMS,而当窗口消失后恢复原先屏幕的内容。以下是程序,为什么实现不了呢?

char buf[800];//全局数组变量,每次取一行800个像素
unsigned short xms_handle;//XMS句柄
/**********************************************************/
/* 保存窗口内容到XMS
/**********************************************************/
void Save_Window_XMS(int x1,int y1,int x2,int y2)
{
int i,j;
unsigned short size,len;
unsigned long offset = 0;
char *pp;

size = (x2-x1+1)*(y2-y1+1)/1024 +1;
if (XMS_Size() < size)
puts("not enough XMS");
if ((xms_handle = XMS_Alloc(size)) == 0)//XMS申请空间成功
puts("XMS handle Error...\n");
for (i= y1; i<=y2;i++)
{
pp=buf;
for (j= x1; j<=x2;j++)
*pp++ = getpixel(j,i);//在屏幕上获取像素点
len = x2-x1+1;
Write_To_XMS(buf,len,xms_handle,offset);//缓冲区buf中存储的像素送至XMS
offset += len;
}

}

/**********************************************************/
/* 恢复XMS中的内容到屏幕
/**********************************************************/
void _Cdecl Restore_Window_XMS(int x1,int y1,int x2,int y2)
{
int i,j;
unsigned short len;
unsigned long offset = 0;
char *pp;

len = (x2-x1+1)
for (i= y1; i<=y2;i++)
{
Read_From_XMS(buf,len,xms_handle,offset);
offset += len;
pp=buf;
for (j= x1; j<=x2;j++)
putpixel(j,i,*pp++);
}
XMS_Free(xms_handle);
}

搜索更多相关主题的帖子: 图形模式 窗口 屏幕 int XMS 
2006-11-21 17:26
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 
错了,更正为:
版主:
图形模式800X600下我想实现,当窗口弹出前保存屏幕内容到XMS,而当窗口消失后恢复屏幕的内容从XMS到显示器上。

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2006-11-21 20:24
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 
请问:是否保存屏幕就是把屏幕上的像素点存储在缓冲区中,
char buffer[800];
char *p;
p=buffer;
for (i=x1,j=0;i<x2;i++)
*p++= getpixel(i,j);

而恢复屏幕就是把存储在缓冲区中的像素重新画在屏幕上
char *p;
p=buffer;
for (i=x1,j=0;i<x2;i++)
putpixel(i,j,*p++);

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2006-11-22 09:25
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
对,是的,你可以写个程序验证一下。
我在上班,没时间给你多看,提醒你如果能排除从屏幕上读像素部分的代码没问题的话,那你就要查查读写XMS的那几个函数了。
2006-11-22 10:19
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 

谢谢一笔苍穹,我的XMS程序没有问题,
我的程序运行的结果是:执行完屏幕恢复子程序后,被窗口遮盖的部分显示“一个黑色的矩形”,我程序中的背景色为黑色。
char getpixel(int x, int y)
{
long addr;
int page;
char far *videoptr = (char far *)0xa0000000L;

addr = (long)y * 800 + x;
page = (int)(addr >> 16);
set_vbe_page(page);
return *(videoptr + (unsigned)(addr & 0xffff));
}


/////////////////////////////////////////////////////////////////////////////////////////////////
//画点函数
/////////////////////////////////////////////////////////////////////////////////////////////////
void putpixel(int x,int y,int color)
{
long addr;
int page;
char far *videoptr = (char far *)0xa0000000L;

addr = (long)y * 800 + x;
page = (int)(addr >> 16);
set_vbe_page(page);
setcolor(color);
*(videoptr+(unsigned int)(addr&0xffff))= color;
}

//-----------------------------------------------------------
//英文输出函数
//-----------------------------------------------------------
void puthz(int x,int y,char *p,int color,int d)
{
unsigned char far *ROM_ASCII;
unsigned int i,j;
unsigned char ch;
char buf[32];

while((ch=*p++)!=0)
{
ROM_ASCII = cur_asc_rom(S8X16);//取16X8点阵字模
for(i=0;i<16;i++)
{
buf[i*2]=*(ROM_ASCII+(ch)*16+i);
buf[i*2+1]=0; /*字模右边8位补0*/

}
for(j=0;j<16;j++)
for(i=0;i<8;i++)
if ((0x80>>i%8)&buf[2*j+i/8])
putpixel(i+x,y+j,color);//用color色打点
else
putpixel(i+x,y+j,BLACK);//用黑色背景色打点
x+=8+d;
}
}
}

1、由于我显示的数字要改变,如果不增加:putpixel(i+x,y+j,BLACK);,则如果原先显示123,现在显示454,则屏幕上就会一团糟,看不清,请问有什么好的办法,
2、为什么,执行完屏幕恢复子程序后,被窗口遮盖的部分显示“一个黑色的矩形”?


多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2006-11-22 11:07
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 
难道无人知道?

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2006-11-27 13:03
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
程序我是实在没时间,这几天忙着给公司网站改版。
1、由于我显示的数字要改变,如果不增加:putpixel(i+x,y+j,BLACK);,则如果原先显示123,现在显示454,则屏幕上就会一团糟,看不清,请问有什么好的办法
显示完了用底色覆盖再显示新的是很自然的做法,要不你试试XOR?

2、为什么,执行完屏幕恢复子程序后,被窗口遮盖的部分显示“一个黑色的矩形”?
你不是说你的背景色是黑的吗?你之前保存的是背景色吧?
2006-11-28 09:48
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 

谢谢一笔苍穹,屏幕内容保存到XMS以及恢复屏幕内容从XMS已经解决。
注:POPUP_x1,POPUP_x2,POPUP_y1,POPUP_y2为窗口坐标

typedef unsigned int XMS_HANDLE;
XMS_HANDLE xms_handle; // 伪指针
XMS_HANDLE xms_save_restore_handle; // 伪指针

/*-----------------------------------------------------------
//从常规内存缓冲区buf装载到扩充内存
-----------------------------------------------------------*/
void _Cdecl Write_To_XMS(char *buf,unsigned int size,XMS_HANDLE handle,unsigned long offset)
{
xms.length = size;
xms.source_handle = 0;
xms.source_offset = FP_SEG((void far *)buf);
xms.source_offset <<= 16;
xms.source_offset += FP_OFF((void far *)buf);
xms.dest_handle = handle;
xms.dest_offset = offset;
XMS_Move(&xms);
}


/*-----------------------------------------------------------
//从扩充内存中读取信息到常规内存缓冲区buf
-----------------------------------------------------------*/
void _Cdecl Read_From_XMS(char *buf,unsigned int size,XMS_HANDLE handle,unsigned long offset)
{
xms.length = size;
xms.source_handle = handle;
xms.source_offset = offset;
xms.dest_handle = 0;
xms.dest_offset = FP_SEG((void far *)buf);
xms.dest_offset <<= 16;
xms.dest_offset += FP_OFF((void far *)buf);
XMS_Move(&xms);
}


char sssbuf[500];
void _Cdecl Save_Image_XMS(void)
{
int i,j;
unsigned short size;
unsigned long offset = 0;
char *pp;

size = (POPUP_x2-POPUP_x1+1)*(POPUP_y2-POPUP_y1+1)/1024+1;
if (XMS_Size() < size)
puts("not enough XMS");
if ((xms_save_restore_handle = XMS_Alloc(size)) == 0)
puts("XMS handle Error...\n");
for (i= POPUP_y1; i<=POPUP_y2;i++)
{
size = POPUP_x2-POPUP_x1;
pp = sssbuf;
for (j= POPUP_x1; j<=POPUP_x2;j++)
*pp++ = getpixel(j,i);
Write_To_XMS(sssbuf,size,xms_save_restore_handle,offset);
offset += size;
}
}

void _Cdecl Restore_Image_XMS(void)
{
int i,j;
unsigned short size;
unsigned long offset = 0;
char *pp;

size = POPUP_x2-POPUP_x1;
for (i= POPUP_y1; i<=POPUP_y2;i++)
{
Read_From_XMS(sssbuf,size,xms_save_restore_handle,offset);
offset += size;
pp = sssbuf;
for (j= POPUP_x1; j<=POPUP_x2;j++)
putpixel(j,i,*pp++);//sssbuf[j-POPUP_x1]);
}
XMS_Free(xms_save_restore_handle);
}


多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2006-11-30 08:40
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
呵呵,恭喜~~
2006-11-30 10:37
快速回复:800X600图形模式 窗口的保存及恢复屏幕窗口
数据加载中...
 
   



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

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