|
以下是我的源程序主要要在窗口中显示一张图片文件名为(set.bmp)
编译链接都没问题但图片在窗口中一闪即不见,请教诸位大虾我错在
哪里。
谢谢。
# include <iostream.h>
# include <conio.h>
# include <windows.h>
# include <windowsx.h>
# include <mmsystem.h>
# include <ddraw.h>
# include "Konfu.h"
# define WIN32_LEAN_AND_WEAN
# define SCREEN_WIDTH 640
# define SCREEN_HEIGHT 480
# define SCREEN_BPP 32
# define INIT_DXSTRUCT(dxs) {ZeroMemory(&dxs, sizeof(dxs)); ddsd.dwSize=sizeof(dxs);}
HWND hWndMain;
LPDIRECTDRAW lpdd;
LPDIRECTDRAW4 lpdd4;
DDSURFACEDESC2 ddsd;
LPDIRECTDRAWSURFACE4 lpddsPrimary;
LPDIRECTDRAWSURFACE4 lpddsBack;
LPDIRECTDRAWSURFACE4 lpddsOffscreen;
HDC hDdc, hSdc;
BITMAP bmp;
HBITMAP hbmp;
//
///////////WinMain
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
//初始化函数作用注册并创建主窗口
if (!initApplication(hInstance, nCmdShow))
{
return FALSE;
}
//初始化DD作用创建DD对象、表面等。调入及显示图片
也在此函数中完成
DDint();
while(1)
{
if (PeekMessage(&msg,hWndMain,0,0,PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
//释放各种资源
GameShutdown();
return (msg.wParam);
}
//
////////////WinMainProc
LRESULT CALLBACK WinMainProc(HWND hWndMain,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
{
return (0);
}break;
case WM_DESTROY:
{
PostQuitMessage(0);
return (0);
}break;
default: break;
}
return (DefWindowProc(hWndMain,msg,wParam,lParam));
}
//////////////////////////////////////
static BOOL initApplication(HINSTANCE hInstance, int nCmdShow)
{
WNDCLASSEX wcls;
// registerWinclass
wcls.cbSize = sizeof(wcls);
wcls.style = CS_HREDRAW|CS_VREDRAW;
wcls.lpfnWndProc = WinMainProc;
wcls.cbClsExtra = 0;
wcls.cbWndExtra = 0;
wcls.hInstance = hInstance;
wcls.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wcls.hCursor = LoadCursor(NULL, IDC_ARROW);
wcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wcls.lpszMenuName = NULL;
wcls.lpszClassName = "GameClass";
wcls.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
if (!RegisterClassEx(&wcls))
{
return FALSE;
}
// createWindows
hWndMain= CreateWindowEx(
NULL,
"GameClass",
"hello",
WS_VISIBLE|WS_OVERLAPPEDWINDOW,
0,0,
500,500,
NULL,
NULL,
hInstance,
NULL);
if (!hWndMain)
return FALSE;
// showWindows
ShowWindow(hWndMain, nCmdShow);
UpdateWindow(hWndMain);
return TRUE;
}
///////////////////////////
DDint()
{
if (FAILED(DirectDrawCreate(NULL,&lpdd,NULL)))
{
return (0);
}
if (FAILED(lpdd->QueryInterface(IID_IDirectDraw4, (LPVOID *)&lpdd4)))
{
return (0);
}
if (FAILED(lpdd4->SetCooperativeLevel(hWndMain, DDSCL_ALLOWREBOOT|DDSCL_FULLSCREEN|DDSCL_EXCLUSIVE)))
{
return (0);
}
if (FAILED(lpdd4->SetDisplayMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,0,0)))
{
return (0);
}
INIT_DXSTRUCT(ddsd);
ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
ddsd.dwBackBufferCount=1;
ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|
DDSCAPS_COMPLEX|
DDSCAPS_FLIP|
DDSCAPS_VIDEOMEMORY;
if (FAILED(lpdd4->CreateSurface(&ddsd,&lpddsPrimary,NULL)))
{
return (0);
}
ddsd.ddsCaps.dwCaps=DDSCAPS_BACKBUFFER;
if (FAILED(lpddsPrimary->GetAttachedSurface(&ddsd.ddsCaps,&lpddsBack)))
{
return (0);
}
INIT_DXSTRUCT(ddsd);
ddsd.dwFlags=DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT;
ddsd.dwWidth=SCREEN_WIDTH;
ddsd.dwHeight=SCREEN_HEIGHT;
ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN|
DDSCAPS_VIDEOMEMORY;
if (FAILED(lpdd4->CreateSurface(&ddsd,&lpddsOffscreen,NULL)))
{
return (0);
}
MyLoadBitmap(lpddsPrimary);//此函数用于将图片载入内存并在
主SURFACE中显示出来。
// lpddsPrimary->Blt(NULL, lpddsBack, NULL, DDBLT_WAIT, NULL);
lpdd->Release();
lpdd=NULL;
return TRUE;
}
////////////////////////////////////////
GameShutdown()
{
lpddsOffscreen->Release();
lpddsOffscreen=NULL;
lpddsBack->Release();
lpddsBack=NULL;
lpddsPrimary->Release();
lpddsPrimary=NULL;
lpdd4->Release();
lpdd4=NULL;
return (1);
}
////////////////////////////////////////
MyLoadBitmap(LPDIRECTDRAWSURFACE4 lpdds)
{
int nHeight, nWidth;
if ((hbmp=(HBITMAP)LoadImage(NULL, "set.bmp", IMAGE_BITMAP,0,0, LR_LOADFROMFILE))==NULL)
{
return FALSE;
}
if ((hSdc=CreateCompatibleDC(NULL))==NULL)
{
return FALSE;
}
if ((SelectObject(hSdc, hbmp))==NULL)
{
DeleteDC(hSdc);
return FALSE;
}
if (GetObject(hbmp, sizeof(BITMAP), &bmp)==0)
{
DeleteDC(hSdc);
return FALSE;
}
nHeight=bmp.bmHeight;
nWidth=bmp.bmWidth;
if (FAILED(lpdds->GetDC(&hDdc)))
{
DeleteDC(hSdc);
return FALSE;
}
BitBlt(hDdc,0,0,nWidth,nHeight,hSdc,0,0,SRCCOPY);
DeleteDC(hSdc);
return TRUE;
} |
|