DirectDraw CreateSurface老是失败,为什么呢?

xgcdd 2014-08-28 09:56:34

#include "MyDirectDraw.h"
#include <string>

#define TIMER_ID 1
#define TIMER_RATE 500

MyDirectDraw::MyDirectDraw(){
m_pDD=NULL;
m_pDDSFront=NULL;
m_pDDSBack=NULL;
}

void __stdcall MyDirectDraw::timer_proc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
//HDC hdc;
//HRESULT ddrval=m_pDDSFront->GetDC(&hdc);
//SetBkColor( hdc,RGB(0,0,255) );
//SetTextColor( hdc,RGB(255,255,0) );
//std::string str("Hello");
//TextOut( hdc,200,200,str.c_str(),str.length() );
//m_pDDSFront->ReleaseDC(hdc);

}

void MyDirectDraw::Paint(HWND hwnd)
{
HRESULT ddrval=DirectDrawCreate( NULL,&m_pDD,NULL );
if( DD_OK!=ddrval )
{
//::MessageBox(NULL,_T("DirectDrawCreate Failed."),_T("DirectDrawCreate"),MB_OK);
return;
}
ddrval=m_pDD->SetCooperativeLevel( hwnd,DDSCL_NORMAL );
ddrval=m_pDD->SetDisplayMode( 1600,900,24 );

DDSURFACEDESC ddsd;
ddsd.dwSize=sizeof(ddsd);
ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount=1;

ddrval=m_pDD->CreateSurface( &ddsd,&m_pDDSFront,NULL );
if( DD_OK!=ddrval )
{
::MessageBox(NULL,"CreateSurface Failed.","CreateSurface",MB_OK);
::PostMessage(hwnd, WM_CLOSE, 0, 0);
return;
}

DDSCAPS ddscaps;
ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
ddrval=m_pDDSFront->GetAttachedSurface( &ddscaps,&m_pDDSBack );

SetTimer( hwnd,TIMER_ID,TIMER_RATE,timer_proc );

//HDC hdc;
//ddrval=m_pDDSFront->GetDC(&hdc);
//SetBkColor( hdc,RGB(0,0,255) );
//SetTextColor( hdc,RGB(255,255,0) );
//std::string str("Hello");
//TextOut( hdc,200,200,str.c_str(),str.length() );
//m_pDDSFront->ReleaseDC(hdc);

//RECT rcClient={100.0,100,400,300};
//m_pDDSFront->Blt( &rcClient,m_pDDSFront,NULL,DDBLT_WAIT,NULL );
}

上面的代码执行到
ddrval=m_pDD->CreateSurface( &ddsd,&m_pDDSFront,NULL );
if( DD_OK!=ddrval )
{
::MessageBox(NULL,"CreateSurface Failed.","CreateSurface",MB_OK);
::PostMessage(hwnd, WM_CLOSE, 0, 0);
return;
}
就出来了,为什么啊?
...全文
525 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
movsd 2014-08-28
  • 打赏
  • 举报
回复
DDSURFACEDESC并不只有4个成员,请将没有用到的成员清零,可以先memset(&ddsd,0,sizeof(DDSURFACEDESC))后再给成员赋值。
赵4老师 2014-08-28
  • 打赏
  • 举报
回复
听说DirectDraw每次只能一个进程使用。
xgcdd 2014-08-28
  • 打赏
  • 举报
回复

#include  "MyDirectDraw.h"
#include <string>

#define TIMER_ID            1
#define TIMER_RATE          500

MyDirectDraw::MyDirectDraw(){
	m_pDD=NULL;
	m_pDDSFront=NULL;
	m_pDDSBack=NULL;
}

void __stdcall MyDirectDraw::timer_proc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
	//HDC hdc;
	//HRESULT ddrval=m_pDDSFront->GetDC(&hdc);
	//SetBkColor( hdc,RGB(0,0,255) );
	//SetTextColor( hdc,RGB(255,255,0) );
	//std::string str("Hello");
	//TextOut( hdc,800,400,str.c_str(),str.length() );
	//m_pDDSFront->ReleaseDC(hdc);

}

void MyDirectDraw::Paint(HWND hwnd)
{
	HRESULT ddrval=DirectDrawCreate( NULL,&m_pDD,NULL );
	if( DD_OK!=ddrval )
	{
		//::MessageBox(NULL,_T("DirectDrawCreate Failed."),_T("DirectDrawCreate"),MB_OK);
		return;
	}
	ddrval=m_pDD->SetCooperativeLevel( hwnd,DDSCL_NORMAL );
	ddrval=m_pDD->SetDisplayMode( 1600,900,24 );

	DDSURFACEDESC ddsd;
	memset(&ddsd,0,sizeof(DDSURFACEDESC));
	ddsd.dwSize=sizeof(ddsd);
	ddsd.dwFlags=DDSD_CAPS;
	ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE;

	ddrval=m_pDD->CreateSurface( &ddsd,&m_pDDSFront,NULL );
	if( DD_OK!=ddrval )
	{
		::MessageBox(NULL,"CreateSurface Failed.","CreateSurface",MB_OK);
		::PostMessage(hwnd, WM_CLOSE, 0, 0);
		return;
	}

	HDC hdc;
	ddrval=m_pDDSFront->GetDC(&hdc);
	SetBkColor( hdc,RGB(0,0,255) );
	SetTextColor( hdc,RGB(255,255,0) );
	std::string str("Hello");
	TextOut( hdc,800,400,str.c_str(),str.length() );
	//m_pDDSFront->ReleaseDC(hdc);

	//DDSCAPS ddscaps;
	//ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
	//ddrval=m_pDDSFront->GetAttachedSurface( &ddscaps,&m_pDDSBack );
	SetTimer( hwnd,TIMER_ID,TIMER_RATE,timer_proc );

}
经过修改,不要 //m_pDDSFront->ReleaseDC(hdc);这句就可以在屏幕上输出. 但前面的两个DDSURFACE为什么不能建立成功呢?
xgcdd 2014-08-28
  • 打赏
  • 举报
回复
修改成 ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP; 还是failed
movsd 2014-08-28
  • 打赏
  • 举报
回复
说错了,不是不能创建主表面,是不能创建COMPLEX表面
movsd 2014-08-28
  • 打赏
  • 举报
回复
DDSCL_NORMAL模式不能创建主表面,只能创建离屏表面,要创建主表面,必须使用独占模式
xgcdd 2014-08-28
  • 打赏
  • 举报
回复
添加memset( &ddsd,0,sizeof(ddsd) );结果还是没有变化哦,

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧