以下是我从网上好不容易google的,
#include<conio.h>
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include <dos.h>
#include <stdlib.h>
#define VBE320X200X256 0X13
#define VBE640X480X256 0X101
#define VBE800X600X256 0X103
#define VBE1024X768X256 0X105
class VIEW //显示类
{
char *video,_video_; //虚拟屏幕内存指针
unsigned short g_cur_vbe_page; //引用neo变量
public:
VIEW(); //本类构造函数
~VIEW(); //本类析构函数
void InitGraph(void); //初始化显示模式
void CloseGraph(void); //关闭图形模式
void set_vbe_page(int page); //引用neo函数
void BitBlt(); //将虚拟屏幕的内容写至物理屏幕上
void PutPixel(int x,int y,int color); //指定颜色画点
void HLine(int x,int y,int color); //画横线
};
VIEW::VIEW()
{
GuiInitGraph(); //初始化图形显式模式
_video_=(char *)malloc(800*600*sizeof(char)); //为虚拟屏幕分配内存
video = _video_;
}
VIEW::~VIEW() //本类析构函数,自动执行
{
free(video); //释放虚拟屏幕所用内存
GuiCloseGraph(); //初始化屏幕为文本状态
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//显存换页函数 引用neo函数
/////////////////////////////////////////////////////////////////////////////////////////////////
void VIEW:: 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 VIEW::GuiInitGraph(void)
{
_AX = 0x4F02;
_BX = VBE800X600X256;
__int__(0x10);
if(_AH != 0)
{
puts("Can't Initialize the graphics mode!");
exit(1);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//关闭图形模式函数
/////////////////////////////////////////////////////////////////////////////////////////////////
void VIEW::GuiCloseGraph(void)
{
_AX = 0x4F02;
_BX = 0x03;
__int__(0x10);
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//按指定颜色画点到虚拟屏幕
/////////////////////////////////////////////////////////////////////////////////////////////////
void VIEW::PutPixel(int x, int y,int color)
{
if(x<=799 &&y<=599)
{
video=_video_+y*800+x; //移动虚拟屏幕指针
*video=color=c; //写入颜色代码并改变当前颜色
}
video=_video_; //恢复虚拟屏幕指针
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//虚拟屏幕800X600送物理屏幕函数
/////////////////////////////////////////////////////////////////////////////////////////////////
void VIEW::BitBlt() //屏幕刷新函数
{
unsigned char i;
unsigned short *VIDEO=(unsigned short *)(0xA000<<4); //显存指针
video=_video; //恢复虚拟屏幕指针
for(i=0;i<14;i++)
{
set_vbe_page(i); //选择显存页面
memcpy(VIDEO,video,65536); //从虚拟屏幕拷贝64k数据到显存
video+=32768; //虚拟屏幕指针后移
}
set_vbe_page(14); //选择最后一页
memcpy(VIDEO,video,42496); //写入最后一页数据
video=_video; //恢复虚拟屏幕指针
}
void main()
{
VIEW vga; //创建控制指针
for (int i=0;i<800;i++)
for (int j=0;j<600;j++)
vga.PutPixel(i,j,WHITE);//从虚屏用白色点填充
vga.BitBlt(); //送到物理屏幕
getch();
getch();
}
一笔苍穹,上面的程序怎么无法实现800X600X256的屏幕上满屏显示白色呢?