|
err=%d",ddrval);
return FALSE;
}
ddrval=lpDD->SetDisplayMode(GModeX,GModeY,GBPP);
if(ddrval!=DD_OK)
{
Msg("SetDisplayMode failed
err=%d",ddrval);
return FALSE;
}
//check capabilites
DDCAPS ddcaps;
ddcaps.dwSize=sizeof(ddcaps);
ddrval=lpDD->GetCaps(&ddcaps,NULL);
if(ddrval!=DD_OK)
{
Msg("GetCaps failed err=%d",ddrval);
return FALSE;
}
if(ddcaps.dwCaps&DDCAPS_NOHARDWARE)
{
Msg("No hardware support at all");
}
//default to double buffered on 1mb,triple buffered
if(nBufferCount==0)
{
if(ddcaps.dwVidMemTotal<=1024L*1024L*(GBPP/8)||GModeX>640)
{
nBufferCount=2;
}
else
{
nBufferCount=3;
}
}
DDSURFACEDESC ddsd;
::ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount=nBufferCount-1;
ddrval=lpDD->CreateSurface(&ddsd,&lpFrontBuffer,NULL);
if(ddrval!=DD_OK)
{
Msg("CreateSurface failed
err=%d",ddrval);
return FALSE;
}
else Msg("显示内存允许建立的缓冲区数=%d(最多需要3)",nBufferCount);
DDSCAPS ddscaps;
ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
ddrval=lpFrontBuffer->GetAttachedSurface(&ddscaps,&lpBackBuffer);
if(ddrval!=DD_OK)
{
Msg("GetAttachedsurface failed
err=%d",ddrval);
return FALSE;
}
return TRUE;
}
void CDirectXWnd::Msg(LPSTR fmt,...)
{
char buff[256];
va_list va;
lstrcpy(buff,"DirectxWnd:");
va_start(va,fmt);
wvsprintf(&buff[lstrlen(buff)],fmt,va);
va_end(va);
lstrcat(buff,"\r\n");
AfxMessageBox(buff);
}
////////////////////////Virtual Function
BOOL CDirectXWnd::RestoreSurfaces()
{
HRESULT ddrval;
ddrval=lpFrontBuffer->Restore();
if(ddrval!=DD_OK)
return FALSE;
return TRUE;
}
BOOL CDirectXWnd::CleanSurface()
{
if(lpBackBuffer)
{
lpBackBuffer->Release();
lpBackBuffer=NULL;
}
if(lpFrontBuffer)
{
lpFrontBuffer->Release();
lpFrontBuffer=NULL;
}
return TRUE;
}
void CDirectXWnd::UpdateFrame()
{
}
BEGIN_MESSAGE_MAP(CDirectXWnd,CWnd)
//{{AFX_MSG_MAP(CDirectXWnd,Cwnd)
ON_WM_KEYDOWN()
ON_WM_ACTIVATEAPP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
///////////////////CDirectXWnd message handlers
void CDirectXWnd::OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags)
{
switch(nChar)
{
case VK_ESCAPE:
case VK_F12:
PostMessage(WM_CLOSE);
break;
}
CWnd::OnKeyDown(nChar,nRepCnt,nFlags);
}
void CDirectXWnd::OnActivateApp(BOOL bActive,HTASK hTask)
{
CWnd::OnActivateApp(bActive,hTask);
blsActive=bActive;
return;
}
请下载:1、DirectX.zip,工程框架源文件;2、
href="http://webking.online.jn.sd.cn/secondlife/application/CTestWnd.zip">CTestWnd.zip,测试程序源文件。
使用这两个源程序时不要直接编译,因为没有包含编译需要的所有文件,而应该根据本文提示做,需要输入代码的时候,将该文件替换成下载包中的相应文件就可以。另外,请在运行时不要用ALT+TAB切换出来,否则会被锁住,非Reset不可。要想不被锁住,请深入研究DirectDraw技术修改此程序。
color="#0000FF">----无心柳
本文摘自《计算机编程技巧与维护》杂志1999年第3期
整理:无心柳(全部代码已经输入测试通过)1999/11/02
|
|