| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 741 人关注过本帖
标题:800*600*256色将整屏清除程序思路是否可行?
只看楼主 加入收藏
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
 问题点数:0 回复次数:3 
800*600*256色将整屏清除程序思路是否可行?

#include<conio.h>
#include<stdio.h>
#include<string.h>
#include <dos.h>
#include <stdlib.h>
#define VBE800X600X256 0X103
unsigned short g_cur_vbe_page=0;
/////////////////////////////////////////////////////////////////////////////////////////////////
//显存换页函数 引用neo函数
/////////////////////////////////////////////////////////////////////////////////////////////////
void set_vbe_page(int page)
{
if (g_cur_vbe_page != page)
{
_BX = 0;
_DX = g_cur_vbe_page = page;
_AX = 0x4F05;
__int__(0x10);
}
}

/////////////////////////////////////////////////////////////////////////////////////////////////
//初始化屏幕为800X600X256
/////////////////////////////////////////////////////////////////////////////////////////////////
void GuiInitGraph(void)
{
_AX = 0x4F02;
_BX = VBE800X600X256;
__int__(0x10);
if(_AH != 0)
{
puts("Can't Initialize the graphics mode!");
exit(1);
}
}

/////////////////////////////////////////////////////////////////////////////////////////////////
//关闭图形模式函数
/////////////////////////////////////////////////////////////////////////////////////////////////
void GuiCloseGraph(void)
{
_AX = 0x4F02;
_BX = 0x03;
__int__(0x10);
}


/////////////////////////////////////////////////////////////////////////////////////////////////
// 由于分辨率为800*600*256色(8位深度),因此共需800*600/65535=8页=512K
/////////////////////////////////////////////////////////////////////////////////////////////////
void ReDraw()
{
unsigned int i,j;
unsigned char VDCBuf[800];//缓冲区
unsigned int dest_seg = 0xa000;//显存首址
unsigned int dest_off = 0;

for (j = 0 ; j < 8 ; j++) // 页号(共需8页)
{
for (i=0;i<800;i++)
VDCBuf[i] = 4; // 将整屏显示红色
set_vbe_page(j); // 依次选择页号0-页号7
dest_off = 0; // 偏移
/* 由于每页65535,因此先送64800个像素*/
for (i=0;i<81;i++)
{
movedata(FP_SEG(VDCBuf), // 缓冲区段址
FP_OFF(VDCBuf), // 缓冲区偏移
dest_seg, // 显存段址
dest_off, // 显存偏移
800); // 每次送一根扫描线
dest_off += 800; // 指向下一根扫描线
}
/* 将每页余下的735个像素单独送*/
movedata(FP_SEG(VDCBuf), // 缓冲区段址
FP_OFF(VDCBuf), // 缓冲区偏移
dest_seg, // 显存段址
dest_off, // 显存偏移
735); // 每次送一根扫描线
}
}


void main()
{
GuiInitGraph();
ReDraw();
getch();
getch();
GuiCloseGraph();
}

/*
800*600*256色将整屏清除 程序思路如下:
FOR 页号 = 0 TO 7
FOR 扫描线 = 0 TO 81
循环 每次先送每页前64800个像素
END FOR
送当前页剩下的735个像素
END FOR
*/

上述思路对吗?

搜索更多相关主题的帖子: 思路 
2006-12-14 11:52
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 
我准备用EMS建立8页,将屏幕上的8个页信息,分别对应EMS上的8个页(虚屏)。
写屏幕时,先写到虚屏,然后再将虚屏上的内容刷新到物理屏上。
我准备采用虚屏,主要是想制作一些显示特技(如:百叶窗等显示特技)。
上述方法是否可行呢?

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2006-12-14 11:58
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
8次转换映射页并用memset()应该是最快的常规方法,8位色深下尤甚(由于接口参数类型问题使16位色反不那么好用了)。这与你的思路相类似,我以前用过,8位色深下应该没问题。

如果用有现成的画线函数,就用它来实现清屏功能也是不错的方案,当然效率可能要打些折扣了。NEO中用的就是这个方法,由于采用了专门优化过的水平画线函数hline(),所以效率还是非常高的。

重新调用一下分辨率初始化函数也是个办法,因为默认的情况下显示模式切换时显存是会被清空的。这应该算是非常规的方法了。


2006-12-14 12:13
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 

/////////////////////////////////////////////////////////////////////////////////////////////////
// 快速清除屏幕子程序(将缓冲屏幕中的数据直接复制到可见视频缓存区里面去)
// 由于分辨率为800*600*256色(8位深度),因此共需800*600/65535=8页=512K
/////////////////////////////////////////////////////////////////////////////////////////////////
方法一、
void _Cdecl GuiQuickClsScreen(int color)
{
register unsigned int i,j;
register char VDCBuf[1024];
register char far *p=(char far *)0xa0000000L;

memset(VDCBuf,color,1024);
for (j = 0 ; j < 8 ; j++) // 共8页
{
set_vbe_page(j); // 依次选择页号0-7页(参见NEO)
for (i = 0 ; i < 64 ; i++)
memcpy(p+i*1024,VDCBuf,1024);
}
}

方法二、
void _Cdecl GuiQuickClsScreen(int color)
{
register unsigned int i,j;
register char VDCBuf[1024];

memset(VDCBuf,color,1024);
for (j = 0 ; j < 8 ; j++) // 共8页
{
set_vbe_page(j); // 依次选择页号0-7页(参见NEO)
for (i = 0 ; i < 64 ; i++)
movedata(FP_SEG(VDCBuf),FP_OFF(VDCBuf),0xa000,i*1024,1024);
}
}


多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2006-12-30 11:30
快速回复:800*600*256色将整屏清除程序思路是否可行?
数据加载中...
 
   



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

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