最好有代码实现,分不会少。多谢大家。
解决方案 »
- ASIO库怎么得到客户端的IP地址?
- 请教高手这个程序哪里有问题,编译无措,链接就出错了,不知道哪里问题
- 高分。
- HtmlView 如何显示资源文件中的Html资源数据
- 各位有没有好的中文书籍下载?
- 我想继承CSplitterWnd作一个个性化的分割窗,可是VC++6.0的classwizard好象没有CSplitterWnd,怎么班?
- 关于Windows Media Player!
- 快就命吧,CDatabase怎么处理SQL里的ntext或text类型的字段?
- 如何对window的任务列表编程,例如查找有几个应用程序正在运行>
- MFC串口通信编程,MSCOMM读取串口缓冲区数据失败,VARIANT InputData = m_mscom.GetInput();这条语句之后的代码都不执行
- 一个简单的问题
- 菜鸟问题:用ATL能生成.ocx文件
start up DirectDraw
set exclusive mode
create a Primary Surface and lock it
read the surface with the the pointer you get backif you want source code, see an example here, :-)
http://www.xmission.com/~pdalton/projects.htmlThe Main Library
---Screen capture functionality, both full screen and window modes.
要是后一种的话,看来只有挂接DirectX 的Lock()函数了。
如何实现游戏截屏功能 现在很多游戏都提供一种截屏的功能,用来截取游戏中的画面,那么这是如何实现的呢?其实就是把游戏当前屏幕的数据存成一个图片文件;在这里我给出一段源程序,它实现了DirectDraw(16位模式)下的的游戏截屏。生成的文件格式为BMP,程序有比较详细的注释,请各位自己看吧。
bool Is555; // 是否是565模式,这个变量需要用者填写// 功能:将一个16位的DirectDraw表面,存为一张24位BMP位图 (传入主表面即截屏)
// 输入:表面指针,输出的文件名
// 输出:是否成功
bool SaveToBitmapFile(LPDIRECTDRAWSURFACE lpSurface, char* filename)
{
WORD* lpBuffer; // 表面指针
int nPitch; // 表面跨距
int nWidth, nHeight; // 表面宽高
// 打开文件s
FILE* fp;
if( (fp=fopen(filename, "wb")) != NULL )
{
// 锁定表面
DDSURFACEDESC ddsd;
ddsd.dwSize = sizeof(ddsd);
HRESULT ddrval = lpSurface->Lock( NULL, &ddsd, DDLOCK_WAIT, NULL );
if( ddrval == DD_OK )
{
lpBuffer = (WORD *)ddsd.lpSurface;
nWidth = ddsd.dwWidth;
nHeight = ddsd.dwHeight;
nPitch = ddsd.lPitch >> 1; //lPitch以Byte为单位,GraphPitch以WORD为单位。所以GraphPitch = lPitch / 2;
} // 保存文件头
BITMAPFILEHEADER FileHeader;
FileHeader.bfType = 'BM';
FileHeader.bfSize = nWidth * nHeight * 3 + 0x36;
FileHeader.bfReserved1 = 0;
FileHeader.bfReserved2 = 0;
FileHeader.bfOffBits = 0x36;
fwrite(&FileHeader, sizeof(BITMAPFILEHEADER), 1, fp);
// 保存文件信息
BITMAPINFOHEADER Header;
Header.biSize = sizeof(BITMAPINFOHEADER); // 结构的大小
Header.biWidth = nWidth; // 宽
Header.biHeight = nHeight; // 高
Header.biPlanes = 1; // 固定
Header.biBitCount = 24; // 颜色数
Header.biCompression = BI_RGB; // 是否压缩
Header.biSizeImage = nWidth * nHeight * 3; // 图片的大小
Header.biXPelsPerMeter = 0;
Header.biYPelsPerMeter = 0;
Header.biClrUsed = 0;
Header.biClrImportant = 0;
fwrite(&Header, Header.biSize, 1, fp); // 写入具体内容(从下向上存放)
fseek(fp, 0x36, SEEK_SET);
WORD word;
lpBuffer += nWidth * (nHeight - 1);
for(int i=0; i<nHeight; i++)
{
for(int j=0; j<nWidth; j++)
{
word = *lpBuffer;
fputc( GetBlue( word ), fp); // 蓝
fputc( GetGreen( word ), fp); // 绿
fputc( GetRed( word ), fp); // 红
lpBuffer++;
}
lpBuffer -= nPitch*2; // 指针转到上一行的开始
} fclose(fp); // 解锁表面
ddrval = lpSurface->Unlock( NULL );
return true;
} return false;
}inline unsigned char GetRed(WORD color)
{
if( Is555 )
return (color>>7) & 0xff;
else
return (color>>8) & 0xff;
}inline unsigned char GetGreen(WORD color)
{
if( Is555 )
return (color>>2) & 0xff;
else
return (color>>3) & 0xff;
}
inline unsigned char GetBlue(WORD color)
{
return (color & 0x1f) << 3;
} ------------------------
金点时空
softboy
2001.5.9
http://www.gpgame.com
------------------------
那个DEMO不能截另外一个全屏幕游戏的图.
不知道为什么...
我要截另一个用DirectX的程序的屏
如果要,给我发一份mail告诉我, [email protected]
我把它改成了截24位图的版本:好辛苦啊!试试看:inline unsigned char GetRed(char *pixel)
{
return (*pixel);
}inline unsigned char GetGreen(char *pixel)
{
return (*(pixel+1));
}
inline unsigned char GetBlue(char *pixel)
{
return (*(pixel+2));
}
bool SaveToBitmapFile(LPDIRECTDRAWSURFACE lpSurface, char* filename)
{
char* lpBuffer; // 表面指针
int nPitch; // 表面跨距
int nWidth, nHeight; // 表面宽高
// 打开文件s
FILE* fp;
if( (fp=fopen(filename, "wb")) != NULL )
{
// 锁定表面
DDSURFACEDESC ddsd;
ddsd.dwSize = sizeof(ddsd);
HRESULT ddrval = lpSurface->Lock( NULL, &ddsd, DDLOCK_WAIT, NULL );
if( ddrval == DD_OK )
{
lpBuffer = (char *)ddsd.lpSurface;
nWidth = ddsd.dwWidth;
nHeight = ddsd.dwHeight;
nPitch = ddsd.lPitch >2; //lPitch以Byte为单位,GraphPitch以WORD为单位。所以GraphPitch = lPitch / 2;
} // 保存文件头
BITMAPFILEHEADER FileHeader;
FileHeader.bfType = 'BM';
FileHeader.bfSize = nWidth * nHeight * 3 + 0x36;
FileHeader.bfReserved1 = 0;
FileHeader.bfReserved2 = 0;
FileHeader.bfOffBits = 0x36;
fwrite(&FileHeader, sizeof(BITMAPFILEHEADER), 1, fp);
// 保存文件信息
BITMAPINFOHEADER Header;
Header.biSize = sizeof(BITMAPINFOHEADER); // 结构的大小
Header.biWidth = nWidth; // 宽
Header.biHeight = nHeight; // 高
Header.biPlanes = 1; // 固定
Header.biBitCount = 24; // 颜色数
Header.biCompression = BI_RGB; // 是否压缩
Header.biSizeImage = nWidth * nHeight * 3; // 图片的大小
Header.biXPelsPerMeter = 0;
Header.biYPelsPerMeter = 0;
Header.biClrUsed = 0;
Header.biClrImportant = 0;
fwrite(&Header, Header.biSize, 1, fp); // 写入具体内容(从下向上存放)
fseek(fp, 0x36, SEEK_SET);
FILE *wp;
wp=fopen("d:\\debug.txt","w");
fprintf(wp,"nHeight=%d\nnWidth=%d\n",nHeight,nWidth); for(int i=0; i<nHeight; i++)
{
lpBuffer = (char*)ddsd.lpSurface + nWidth*(nHeight-i-1)*3;
fprintf(wp,"Before: %p\n",lpBuffer);
for(int j=0; j<nWidth; j++)
{
fputc(GetRed(lpBuffer), fp); // 红
fputc(GetGreen(lpBuffer), fp); // 绿
fputc(GetBlue(lpBuffer), fp); // 蓝 //lpBuffer++;
lpBuffer+=3;
}
fprintf(wp,"After: %p\n",lpBuffer);
} fclose(wp);
fclose(fp); // 解锁表面
ddrval = lpSurface->Unlock( NULL );
return true;
} return false;
}