程序为什么执行到这里lpDDSurface->GetDC(&hdcSurf),就退出了?想不通. 关键词:directdraw, GetDC().
元明 2001-09-25 01:28:45 //头文件
//: SHOW.H -- Show picture
#ifndef SHOW_H_
#define SHOW_H_
#include "ddraw.h"
class CShowPic {
struct caption{
DWORD dwWidth;
DWORD dwHeight;
DWORD dwRGBCount;
};
caption Caption;
HBITMAP hbm;
HDC hdcImage;
HDC hdcSurf;
DDSURFACEDESC ddsd;
char* BitmapPath;
LPDIRECTDRAW lpDD;
//LPDIRECTDRAW2 lpDD2;
LPDIRECTDRAWSURFACE lpDDSurface;
//LPDIRECTDRAWSURFACE3 lpDDS3;
BOOL Fail(char* ErrorStr);
BOOL LoadBmp();
public:
CShowPic(char* szimage,
DWORD dwWidth = 640,
DWORD dwHeight = 480,
DWORD dwRGBCount = 32);
~CShowPic();
BOOL Init(HWND hWnd);
};
#endif //SHOW_H_
//C++源文件
//: SHOW.CPP
#include "show.h"
#include <winbase.h>
CShowPic::CShowPic(char* szImage,
DWORD dwWidth,
DWORD dwHeight,
DWORD dwRGBCount):BitmapPath(szImage){
Caption.dwHeight = dwHeight;
Caption.dwWidth = dwWidth;
Caption.dwRGBCount = dwRGBCount;
hdcImage = NULL;
hdcSurf = NULL;
lpDD = NULL;
//lpDD2 = NULL;
lpDDSurface = NULL;
//lpDDS3 = NULL;
}
CShowPic::~CShowPic() {
if(hdcImage)
DeleteDC(hdcImage);
if(hdcSurf)
lpDDSurface->ReleaseDC(hdcSurf);
if(hbm)
DeleteObject(hbm);
if(lpDD) {
if(lpDDSurface) {
lpDDSurface->Release();
lpDDSurface = NULL;
}
lpDD->Release();
lpDD = NULL;
}
/*if(lpDD2) {
if(lpDDSurface) {
if(lpDDS3) {
lpDDS3->Release();
lpDDS3 = NULL;
}
lpDDSurface->Release();
lpDDSurface = NULL;
}
lpDD2->Release();
lpDD2 = NULL;
}*/
}
BOOL
CShowPic::Fail(char* ErrorStr) {
OutputDebugString((LPCTSTR)ErrorStr);
return FALSE;
}
BOOL
CShowPic::LoadBmp() {
//HRESULT hRet;
/*if(FAILED(lpDDSurface->QueryInterface(IID_IDirectDrawSurface3,
(LPVOID *)&lpDDS3))) {
return FALSE;
}*/
//empty the ddsd
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
if(FAILED(lpDDSurface->GetSurfaceDesc(&ddsd)))
return FALSE;
if((ddsd.ddpfPixelFormat.dwFlags != DDPF_RGB) ||
(ddsd.ddpfPixelFormat.dwRGBBitCount < 16)) {
OutputDebugString("Nonpalettized RGB required.\n");
return FALSE;
}
//Try and load bitmap
hbm = (HBITMAP)LoadImage(NULL,
BitmapPath, IMAGE_BITMAP, ddsd.dwWidth,
ddsd.dwHeight,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hbm == NULL) {
OutputDebugString("Couldn't find the resource.\n");
return FALSE;
}
//get a memory dc
hdcImage = CreateCompatibleDC(NULL);
SelectObject(hdcImage, hbm);
//get a dc for surface
/*hRet = ;*/
if(FAILED(lpDDSurface->GetDC(&hdcSurf))) {
OutputDebugString("Couldn't get a dc.\n");
return FALSE;
}
if(BitBlt(hdcSurf, 0, 0, ddsd.dwWidth, ddsd.dwHeight,
hdcImage, 0, 0, SRCCOPY) == FALSE) {
OutputDebugString("Bitblt failed.\n");
return FALSE;
}
return TRUE;
}
BOOL
CShowPic::Init(HWND hWnd) {
DDSURFACEDESC ddsd;
//creates DDraw object
if(FAILED(DirectDrawCreate(NULL, &lpDD, NULL))) {
Fail("Couldn't create DDraw object.");
return FALSE;
}
/*if(FAILED(lpDD->QueryInterface(IID_IDirectDraw2,
(LPVOID *)&lpDD2))) {
Fail("Couldn't query the interface.");
return FALSE;
}*/
//set exclusive mode
if(FAILED(lpDD->SetCooperativeLevel(hWnd,
DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN))) {
Fail("Couldn't set cooperative mode.");
return FALSE;
}
//set display mode
if(FAILED(lpDD->SetDisplayMode(Caption.dwWidth,
Caption.dwHeight,
Caption.dwRGBCount))) {
Fail("Couldn't set display mode.");
return FALSE;
}
//create primary surface
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if(FAILED(lpDD->CreateSurface(&ddsd,
&lpDDSurface, NULL))) {
Fail("Couldn't create primary surface.");
return FALSE;
}
if(!LoadBmp()) {
Fail("Couldn't load image.");
return FALSE;
}
return TRUE;
}
程序每次执行到LoadBmp()的lpDDSurface->GetDC(&hdcSurf),就退出了?
执行代码请到这里下载,帮我分析一下,100分.(dx5.0sdk,比较老)
关于bmp图片,随便就行了,然后改为"lake.bmp".
http://magicwizard.cn.hongnet.com/code/showpic.zip