我将图片load到一个suface上面,为什么显示不出来?

iStringTheory 2002-12-27 09:38:02
情况是这样的,我把图片加载到一个“表面”,屏幕却黑糊糊的,按esc退出时屏幕一闪,显示出来图片,但是程序随机就关闭了,这说明图片已经加载了但是并没有显示在前台,请问如何实现现在在前台?加载突破点函数如下:

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);
}
...全文
79 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
iStringTheory 2002-12-27
  • 打赏
  • 举报
回复
您说的那个flip放哪里呀?我这个应该是主表面吧?我只创建了一个表面


-----------------------------
千年精灵( Millennium Genius )
swordsmith 2002-12-27
  • 打赏
  • 举报
回复
你的back surface调用flip了吗?
iStringTheory 2002-12-27
  • 打赏
  • 举报
回复
解决者高分相赠

-----------------------------
千年精灵( Millennium Genius )
iStringTheory 2002-12-27
  • 打赏
  • 举报
回复
没人么?

5555555555555555555555

太失望了

-----------------------------
千年精灵( Millennium Genius )
iStringTheory 2002-12-27
  • 打赏
  • 举报
回复
没人么?

5555555555555555555555

太失望了

-----------------------------
千年精灵( Millennium Genius )
天堂里的死神 2002-12-27
  • 打赏
  • 举报
回复
我用的不是GDI,不知道你要不要:


//-----------------------------------------------------------------------------
//02-12-10
//noslop-forever
//ddraw template:640 480 32
//-----------------------------------------------------------------------------
#include <windows.h>
#include <ddraw.h>
#include "ddutil.h"

#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
#define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p)=NULL; } }
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }

#define WIDTH 640
#define HEIGHT 480
#define BPP 32

LPSTR lpBmp; //λͼָÕë

LPDIRECTDRAW7 lpDD; //direct drawÖ÷Ö¸Õë
LPDIRECTDRAWSURFACE7 lpDDSPrimary; //Ö÷Ò³ÃæÖ¸Õë
LPDIRECTDRAWSURFACE7 lpDDSBack; //´æ·Å±³¾°Í¼µÄÒ³ÃæÖ¸Õë
LPDIRECTDRAWSURFACE7 lpDDSBuffer; //ºǫ́»º´æÒ³ÃæÖ¸Õë
HWND hwnd;

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
static BOOL SetWindowClass(HINSTANCE hInstance,int iCmdShow);
BOOL init();
void GameLoop();
void RestoreSurface();


int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,PSTR szCmdLine,int iCmdShow)
{
MSG msg;

if(!SetWindowClass(hInstance , iCmdShow))
return 0;

if(!init())
return 0;

while(TRUE)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message == WM_QUIT)
break;

TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
GameLoop(); //func here
}
}
return msg.wParam;
}

//////////SUB FUNCTIONS HERE/////////////////////////////////////

static BOOL SetWindowClass(HINSTANCE hInstance,int iCmdShow)
{
WNDCLASS wndclass; //×¢²á´°¿ÚÀà
static TCHAR szAppName[] = TEXT("Dx7");//!!!!!!
wndclass.style = NULL ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = NULL; //!!!!!!
wndclass.hCursor = NULL; //!!!!!!
wndclass.lpszClassName = szAppName;
////////////////////////////////////////////////////////////////////

if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("Need NT"),szAppName,MB_ICONERROR);
return FALSE;
}
////////////////////////////////////////////////////////////////////

hwnd = CreateWindow(szAppName,TEXT("Dx7"), //!!!!!
WS_POPUP | WS_MAXIMIZE,
0,0,
WIDTH , HEIGHT,
NULL,NULL,hInstance,NULL); //!!!!!µ¹ÊýµÚÈý¸ö²ÎÊý

if(!hwnd)
return FALSE;

///»ñÈ¡´°¿Ú¾ä±ú
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
return TRUE;
}

//³õʼ»¯DDRAW

BOOL init()
{
//ͼƬµÄÃû×Ö,Ò»¶¨Òª¼Ó.bmp
lpBmp = " ";
DDSURFACEDESC2 ddsd; //´´½¨Ò³ÃæÃèÊö±í

if(DirectDrawCreateEx(NULL , (void**)&lpDD , IID_IDirectDraw7 , NULL) != DD_OK)
return FALSE;

if((lpDD -> SetCooperativeLevel(hwnd , DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)) != DD_OK)
return FALSE;

//HRESULT SetDisplayMode( DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags );

if((lpDD -> SetDisplayMode(WIDTH , HEIGHT , BPP , 0 , DDSDM_STANDARDVGAMODE)) != DD_OK)
return FALSE;

//Set a 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((lpDD -> CreateSurface(&ddsd , &lpDDSPrimary , NULL)) != DD_OK)
return FALSE;

//Set a Back Buffer
ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
if(lpDDSPrimary -> GetAttachedSurface(&ddsd.ddsCaps , &lpDDSBuffer) != DD_OK)
return FALSE;

//set these two surface black
DDBLTFX ddBltFx;
ddBltFx.dwSize = sizeof(DDBLTFX);
ddBltFx.dwFillColor = RGB(0,0,0);
lpDDSPrimary -> Blt(NULL , NULL , NULL , DDBLT_WAIT | DDBLT_COLORFILL , &ddBltFx);
lpDDSBuffer -> Blt(NULL , NULL , NULL , DDBLT_WAIT | DDBLT_COLORFILL , &ddBltFx);

//Set a Back SurfaceÀëÆÁ±íÃæ
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwHeight = HEIGHT;
ddsd.dwWidth = WIDTH;

if((lpDD -> CreateSurface(&ddsd , &lpDDSBack , NULL)) != DD_OK)
return FALSE;

//if have other operations,
//input here

DDReLoadBitmap(lpDDSBack , lpBmp);

//colorkeyģʽ
DDSetColorKey(lpDDSBack , RGB(255,255,255));

return TRUE;
}

//»Ö¸´Ò³Ãæ
void RestoreSurface()
{
lpDD -> RestoreAllSurfaces();

//Óлָ´Ò³Ãæ·½·¨Ð´ÓÚ´Ë´¦

}

//Ñ­»·²¿·Ö

void GameLoop()
{
//ÓбðµÄÑ­»·Ð´ÔÚÕâÀï

//×¢Òâ²ÎÊý
lpDDSBuffer -> BltFast(0,0,lpDDSBack , NULL , DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
if((lpDDSPrimary -> Flip(NULL , DDFLIP_WAIT)) == DDERR_SURFACELOST) //此处将buffer和primary表面交换!
RestoreSurface();
}

//Îö¹¹×Ó

void Clean()
{
SAFE_RELEASE(lpDDSPrimary);
SAFE_RELEASE(lpDDSBack);
SAFE_RELEASE(lpDDSBuffer);
SAFE_RELEASE(lpDD);
}

//ÏûϢѭ»·

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_SETCURSOR:
SetCursor(NULL);
return 0;

case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
Clean();
PostQuitMessage(0);
default:
break;
}
return 0;


case WM_DESTROY:
Clean();
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}

原来注释的地方是乱码,对不起,明天要考六级,就恕我懒惰一下吧:)
flip我在里面标出来了,注意自己多用用就知道了

8,305

社区成员

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

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