高分求解入门问题!!!!!!!!!!!

iStringTheory 2002-12-31 10:13:33
为什么无法创建 主表面?

错误信息:

ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; //这是后台缓存
if ( FAILED( lpddsPrimary->GetAttachedSurface( &ddsd.ddsCaps, &lpDDSBuffer )) )
return FALSE; //在这里返回false!!!怎么回事?

错误信息:
lpddsPrimary->GetAttachedSurface( &ddsd.ddsCaps, &lpDDSBuffer ) CXX0052: 错误:成员函数不存在

代码:
#include "Main.h"


// G L O B A L S _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
// Windows
HINSTANCE hMainInstance;
HWND hMainWindow;

// DirectDraw
LPDIRECTDRAW7 lpdd7;
LPDIRECTDRAWSURFACE7 lpDDSPrimary;
LPDIRECTDRAWSURFACE7 lpDDSBack; // 存放背景图的页面的指针
LPDIRECTDRAWSURFACE7 lpDDSBuffer; // DirectDraw后台缓存的指针
DDSURFACEDESC2 ddsd;

int Initialize(void)
{
if (DirectDrawCreateEx (NULL, (void **)&lpdd7, IID_IDirectDraw7, NULL) != DD_OK )
return(FALSE);
if (lpdd7->SetCooperativeLevel(hMainWindow,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN)!=DD_OK)
return(TRUE);
if (lpdd7->SetDisplayMode(640,480,32,0,DDSDM_STANDARDVGAMODE)!=DD_OK)
if (lpdd7->SetDisplayMode(640,480,24,0,DDSDM_STANDARDVGAMODE)!=DD_OK)
return(FALSE);

// create our primary surface
memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
ddsd.dwSize=sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS|DDSD_BACKBUFFERCOUNT; //有后台缓存
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1; //一个后台缓存

if((lpdd7 ->CreateSurface(&ddsd , &lpDDSPrimary , NULL)) != DD_OK)
return FALSE;
MessageBox(hMainWindow, "Primary surface OK!", "Notice", MB_OK | MB_ICONINFORMATION);

ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; //这是后台缓存
if ( FAILED( lpDDSPrimary->GetAttachedSurface( &ddsd.ddsCaps, &lpDDSBuffer )) )
return FALSE; ///////////////////////////在这里报错!!!
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; //这是离屏页面

if ( FAILED( lpdd7->CreateSurface( &ddsd, &lpDDSBack, NULL )) )
return FALSE; //创建放背景图的页面
//如还有别的页面可在此处继续创建

if ( LoadBitmapResource(lpDDSBack,0,0,hMainInstance)==false )
MessageBox(hMainWindow, "加载图片失败!","Error",MB_OK | MB_ICONEXCLAMATION);
lpDDSPrimary->Flip(lpDDSBack,DDFLIP_WAIT);

// we're ready to rock
MessageBox(hMainWindow, "Initialization OK!\nYou can start loading the resources! :)", "Notice", MB_OK | MB_ICONINFORMATION);
return(TRUE);
}

///////////////////////////////////////////////////////////////
// SHUTDOWN
// Release the objects we created.
///////////////////////////////////////////////////////////////
void Shutdown(void)
{
if (lpDDSPrimary)
{
// kill the primary surface!
lpDDSPrimary->Release();
lpDDSPrimary = NULL;
}

if (lpdd7)
{
// blow away DirectDraw!
lpdd7->Release();
lpdd7 = NULL;
}

// destroy the window!
CloseWindow(hMainWindow);

// assassinate COM! :)
CoUninitialize();
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
if(!InitWindow(hInstance,nCmdShow)) return false;
MSG msg;
// initialize, test for success
if( Initialize() )
{
for(;;)
{
if(PeekMessage(&msg, NULL, 0, 0 ,PM_REMOVE))
{
if(msg.message==WM_QUIT) break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
else
MessageBox(hMainWindow, "Initialization failed!", "Error", MB_OK | MB_ICONEXCLAMATION);

// shut everything down
Shutdown();
//MessageBox(NULL, "Shutdown OK!", "Notice", MB_OK | MB_ICONINFORMATION);

// give Windows the shutdown code
return(msg.wParam);
}

bool InitWindow(HINSTANCE hInstance, int nCmdShow)
{
WNDCLASSEX sampleClass;
HWND hwnd;
sampleClass.cbSize=sizeof(WNDCLASSEX);
sampleClass.style= CS_DBLCLKS | CS_OWNDC |
CS_HREDRAW | CS_VREDRAW;
sampleClass.lpfnWndProc= MsgHandler;
sampleClass.cbClsExtra= 0;
sampleClass.cbWndExtra= 0;
sampleClass.hInstance=hInstance;
sampleClass.hIcon= LoadIcon(NULL,IDI_WINLOGO);
sampleClass.hCursor= LoadCursor(NULL, IDC_ARROW);
sampleClass.hbrBackground= (HBRUSH)GetStockObject(BLACK_BRUSH);
sampleClass.lpszMenuName= NULL;
sampleClass.lpszClassName= "FrameWork";
sampleClass.hIconSm= LoadIcon(NULL, IDI_WINLOGO);

RegisterClassEx(&sampleClass);

if(!(hwnd=CreateWindowEx(NULL,
"FrameWork",
"My application framework",
WS_POPUP| WS_MAXIMIZE,0,0,
GetSystemMetrics( SM_CXSCREEN ),
GetSystemMetrics( SM_CYSCREEN ),
NULL,
NULL,
hInstance,
NULL))) return false;
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);

//为全局变量赋值
hMainInstance=hInstance;
hMainWindow=hwnd;

return true;
}

int LoadBitmapResource(LPDIRECTDRAWSURFACE7 lpdds, int xDest, int yDest, HINSTANCE hInstance)
{
HDC hSrcDC; // source DC - memory device context
HDC hDestDC; // destination DC - surface device context
HBITMAP hbitmap; // handle to the bitmap resource
BITMAP bmp; // structure for bitmap info
int nHeight, nWidth; // bitmap dimensions

// first load the bitmap resource
if ((hbitmap = (HBITMAP)LoadImage(hInstance, "test.bmp",
IMAGE_BITMAP , 0, 0,
LR_CREATEDIBSECTION | LR_LOADFROMFILE)) == NULL)
return(FALSE);

// create a DC for the bitmap to use
if ((hSrcDC = CreateCompatibleDC(NULL)) == NULL)
return(FALSE);

// select the bitmap into the DC
if (SelectObject(hSrcDC, hbitmap) == NULL)
{
DeleteDC(hSrcDC);
return(FALSE);
}

// get image dimensions
if (GetObject(hbitmap, sizeof(BITMAP), &bmp) == 0)
{
DeleteDC(hSrcDC);
return(FALSE);
}

nWidth = bmp.bmWidth;
nHeight = bmp.bmHeight;

// retrieve surface DC
if (FAILED(lpdds->GetDC(&hDestDC)))
{
DeleteDC(hSrcDC);
return(FALSE);
}

// copy image from one DC to the other
if (BitBlt(hDestDC, xDest, yDest, nWidth, nHeight, hSrcDC, 0, 0,
SRCCOPY) == NULL)
{
lpdds->ReleaseDC(hDestDC);
DeleteDC(hSrcDC);
return(FALSE);
}

// kill the device contexts
lpdds->ReleaseDC(hDestDC);
DeleteDC(hSrcDC);

// return success
return(TRUE);
}

LRESULT CALLBACK MsgHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
case WM_KEYDOWN:
switch ( wParam )
{
case VK_ESCAPE:
PostQuitMessage(0);
break;
}
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
...全文
40 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
天堂里的死神 2002-12-31
  • 打赏
  • 举报
回复
我听老师说:dx9里又引入了directdraw的新版本(graphics又拆分为draw和3D)不知道会不会和这个有关。

我已经下载下来了,把所有的代码拷贝到vc6刚刚建的win32程序里运行,按刚才的几个东东改了后,仍然没有问题(汗)。改天再到我同学那里试一试(我没有vc7)。有可能真的是平台问题也说不定(汗)。您可以试试在return false前面添一句MessageBox输出一个error信息(记得用括号括起来)。我怀疑会不会是运行时库寻找了一个错误的库,这样就当然找不到原来应该支持的东东了。
可以试试把dx7或dx8的sdk包含到include和lib目录下,并将其位置提前,用老库看看能不能通过。

还有一个笑死人的东东:3个月前我已经把我唯一的qq给丢了,当时的号是19992335,但是我现在上不去:)。(大汗)真对不起。祝你新年快乐。
iStringTheory 2002-12-31
  • 打赏
  • 举报
回复
noslopforever(天堂里的死神):

您有QQ么?我的号码 778608
可以交个朋友么?:p
iStringTheory 2002-12-31
  • 打赏
  • 举报
回复
noslopforever(天堂里的死神):
您可以从如下地址下载完整代码,谢谢您帮忙~ :)

www.jxzgs.com/upload/hellogame2.rar
iStringTheory 2002-12-31
  • 打赏
  • 举报
回复
lpDDSPrimary->GetAttachedSurface( &ddsd.ddsCaps, &lpDDSBuffer ) CXX0052: 错误:成员函数不存在

GetAttachedSurface( &ddsd.ddsCaps, &lpDDSBuffer ) CXX0017: 错误:没有找到符号“GetAttachedSurface”
天堂里的死神 2002-12-31
  • 打赏
  • 举报
回复
您用的是IDirectDraw7接口,也就表明我们用的都是Dx7,这上面应该是没有问题阿:)

但是我这里确实是通过了:)我已经重新清洁后编译并运行了,除了图片没有显示外,别的信息都出来了。……这么说吧,您所指的报错是出现了什么东东呢?

这里还有一个别的问题:lpDDSBack是指离屏页面吧,Flip交换链最好还是作用到lpDDSBuffer上,会比较快。图片嘛,可以从lpDDSBack给bltfast到lpDDSBuffer上。这根这次问题无关。
if ( LoadBitmapResource(lpDDSBack,0,0,hMainInstance)==false )
MessageBox(hMainWindow, "¼ÓÔØͼƬʧ°Ü!","Error",MB_OK | MB_ICONEXCLAMATION);
lpDDSPrimary->Flip(lpDDSBack,DDFLIP_WAIT);
iStringTheory 2002-12-31
  • 打赏
  • 举报
回复
您好,您那里
if ( FAILED( lpDDSPrimary->GetAttachedSurface( &ddsd.ddsCaps, &lpDDSBuffer )) )
return FALSE;
可安全通过?我这里却每次总是返回false,根本运行不到创建离屏页面的那部分,难道是运行平台的原因?
我用的是VC7+DX9
天堂里的死神 2002-12-31
  • 打赏
  • 举报
回复
300和400纯属乱填,ddsd.dwHeight ddsd.dwWidth应该至少和图片大小一致。
天堂里的死神 2002-12-31
  • 打赏
  • 举报
回复
仁兄:并非buffer表面的错误:请看我的检测方法:首先是在您所认为的错误一句下面添加依据检测:

if ( FAILED( lpDDSPrimary->GetAttachedSurface( &ddsd.ddsCaps, &lpDDSBuffer )) )
return FALSE; ///////////////////////////在这里报错!!!
MessageBox(hMainWindow, "Buffer surface OK!", "Notice", MB_OK | MB_ICONINFORMATION);////////new!!!!!!!!!!!!!!检测

然后愚者发现此处安全的通过,出现了应该出现的MessageBox :)说明buffer没有问题

再向下,在back叶面的相应位置添入一句检测
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; //这是离屏页面

if ( FAILED( lpdd7->CreateSurface( &ddsd, &lpDDSBack, NULL )) )
return FALSE; //创建放背景图的页面

MessageBox(hMainWindow, "Back surface OK!", "Notice", MB_OK | MB_ICONINFORMATION);///////////////new!!!!!!!!!检测

但是,这里却没有通过。为什么呢?我又拿以前写的相似的代码对照发现:
在back表面申请时,ddsd.dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT;一句要求得到ddsd描述表的高和宽,但是代码中却没有给出,于是在代码中加入:
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; //这是离屏页面
ddsd.dwHeight = 300;/////new!!!!!!!!!11
ddsd.dwWidth = 400;////////new!!!!!!!!1

这以后代码顺畅执行,没有再出现什么error,
我用的是vc6+directx7。希望平台上没有什么出入:)

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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