程序为什么执行到这里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
...全文
197 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
元明 2001-09-25
  • 打赏
  • 举报
回复
2000下是没事,谢谢你帮我测试,看来是我的98有毛病了。
嘻嘻!
元明 2001-09-25
  • 打赏
  • 举报
回复
能正常退出?
难道没死机,我今天调这个程序死了十来次了,我这里不能运行呀.
chenlee 2001-09-25
  • 打赏
  • 举报
回复
在我机器上没问题:PII450 + TNT2M64 + Win2K Server
元明 2001-09-25
  • 打赏
  • 举报
回复
没人知道吗?
Jneu 2001-09-25
  • 打赏
  • 举报
回复
gz

8,325

社区成员

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

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