| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1820 人关注过本帖
标题:800X600X256 虚拟缓冲区送显示缓冲区的困惑
取消只看楼主 加入收藏
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
 问题点数:0 回复次数:6 
800X600X256 虚拟缓冲区送显示缓冲区的困惑

方法如下:为屏幕建立一个虚拟屏幕,即在内存中开辟一片空间,用于存放屏幕信息。若将欲送到屏幕上的内容先送到虚拟屏幕(以下简称虚屏)中,然后将虚屏内容复制到物理屏幕上,
  ┌──────┐ 写入┌────┐ 写入┌────┐
  │欲显示的信息├──> 虚拟屏幕 ├──> 物理屏幕│
  └──────┘ └────┘ └────┘

1、在320X200X256下,可通过下面两条指令
VDCBuf=new (unsigned char)(320*200);
(a).memset(VDCBuf,RED,320*200);
(b).for ( i = 0 ; i < 200 ; i++)
movedata(FP_SEG(&(VDCBuf[i*320])),FP_OFF(&(VDCBuf[i*320])),0xA000,i*320,320);
将整个屏幕初始化为红色,
2、请问由于在800X600X256下存在分页,如何将通过虚拟屏幕将物理屏幕初始化为红色

搜索更多相关主题的帖子: 缓冲区 物理 屏幕 内存 困惑 
2006-11-08 16:41
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 
谢谢一笔苍穹,我先查一查吴进相关的文章。

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

以下是我从网上好不容易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的屏幕上满屏显示白色呢?


多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2006-11-09 17:03
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 
一笔苍穹:
1、 件扩展名为*.CPP时,可以采用
_video_= new ( char)[800*600]; // 为虚拟屏幕分配内存
if (_video_f==NULL) // 内存分配失败
{
exit(1);
}
那么在扩展名为*.C时,该如何分配呢?我试过如果使用
_video_=(char *)malloc(800*600*sizeof(char));
不可靠,该如何办呢?
2、如何将虚拟屏幕_video_写到物理屏幕呢?
  如果每次往物理屏幕送1行=800个像素,采用movedata()函数,有可能进行换页,我不知道该如何处理。
  如果每次往物理屏幕送10行=8000个像素,采用movedata()函数,又该如何处理。

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

TC++3.0 for dos/BC3.1++ for dos

、如何将虚拟屏幕_video_写到物理屏幕呢?
  如果每次往物理屏幕送1行=800个像素,采用movedata()函数,有可能进行换页,我不知道该如何处理。
for (int i=0;i<600;i++)
movedata(source_seg,source_off,dest_seg,dest_off,800);
但是换页时该如何处理呢?我看到过《RockCarry工作室》的陈凯发表过虚拟缓冲区送显示缓冲区相关的文章。


多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2006-11-10 11:37
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 
一笔苍穹:
1、我必须要在DOS下用TC++编程,由于要画实时曲线,因此希望将画的中间过程全部(以前画的线全部清除,当前时刻重新画线)在虚拟屏上做,最后显示屏上显示的是最终结果。
  看来,只能用XMS存储虚拟屏幕内容了。XMS方面的编程我参照你的NEO程序已经完全调试成功(汉字库HZK16就是调入XMS内存中)但是,如果将虚拟屏内容送到物理屏幕
我摸不着边际,请求一笔苍穹帮忙,  
  如果每次往物理屏幕送1行=800个像素,采用movedata()函数,中间进行换页,该如何处理?
for (int i=0;i<600;i++)
movedata(source_seg,source_off,dest_seg,dest_off,800);
 2、如何显示一个红色的底色白色的字呢(红底白字),图形模式有前景色及背景色的概念吗?

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2006-11-10 14:58
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏
得分:0 
太感谢一笔苍穹了。
不知你的GUI设计的怎么样了,我觉得要想在DOS下设计出《WINDOWS经典界面》开始菜单上的“白色”都比较困难,还有窗口上的标题条上的“过渡色”,不知如何设计,主要是对设色板无概念。

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2006-11-10 16:16
快速回复:800X600X256 虚拟缓冲区送显示缓冲区的困惑
数据加载中...
 
   



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

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