帮忙看一段DirectDraw代码
qtgm 2004-12-24 11:12:56 #include <afxwin.h>
#include <ddraw.h>
class MFrame:public CFrameWnd{
public:
LPDIRECTDRAW7 lpd;
LPDIRECTDRAWSURFACE7 lpzz;
LPDIRECTDRAWSURFACE7 lpbb;
LPDIRECTDRAWSURFACE7 lpma;
LPDIRECTDRAWSURFACE7 lpmb;
LPDIRECTDRAWSURFACE7 lpmc;
LPDIRECTDRAWSURFACE7 lpmd;
LPDIRECTDRAWSURFACE7 lpme;
LPDIRECTDRAWSURFACE7 lpmf;
LPDIRECTDRAWSURFACE7 lpmmu;
LPDIRECTDRAWSURFACE7 lpmmd;
DDSCAPS2 caps;
DDSURFACEDESC2 desc;
HRESULT result;
HDC hdc,hdc1;
DDCOLORKEY key;
HBITMAP ssgg,plmm,dl,mm1,mm2,mm3;
MFrame()
{
Create(0,"MFC",WS_POPUP);
CreateDraw();
LoadPic();
}
~MFrame()
{
lpd->Release();
lpzz->Release();
lpma->Release();
lpmb->Release();
lpmc->Release();
lpmd->Release();
lpme->Release();
lpmf->Release();
}
void CreateDraw()
{
int result = DirectDrawCreateEx(NULL,(VOID**)&lpd,IID_IDirectDraw7,NULL);
if(result != DD_OK) return ;
result = lpd->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT);
result = lpd->SetDisplayMode(640,480,32,0,DDSDM_STANDARDVGAMODE);
memset(&desc,0,sizeof(desc));
desc.dwSize = sizeof(desc);
desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
desc.dwBackBufferCount = 1;
desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
result = lpd->CreateSurface(&desc,&lpzz,NULL);
caps.dwCaps = DDSCAPS_BACKBUFFER;
result = lpzz->GetAttachedSurface(&caps,&lpbb);
memset(&desc,0,sizeof(desc));
desc.dwSize = sizeof(desc);
desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
desc.dwWidth = 640;
desc.dwHeight = 480;
result = lpd->CreateSurface(&desc, &lpma, NULL);
result = lpd->CreateSurface(&desc, &lpmb, NULL);
result = lpd->CreateSurface(&desc, &lpmc, NULL);
result = lpd->CreateSurface(&desc, &lpmd, NULL);
result = lpd->CreateSurface(&desc, &lpme, NULL);
result = lpd->CreateSurface(&desc, &lpmf, NULL);
result = lpd->CreateSurface(&desc, &lpmmu, NULL);
result = lpd->CreateSurface(&desc, &lpmmd, NULL);
/**/
}
void LoadPic()
{
hdc = ::CreateCompatibleDC(NULL);
ssgg = (HBITMAP)::LoadImage(NULL,"p.bmp",IMAGE_BITMAP,40,40,LR_LOADFROMFILE);
plmm = (HBITMAP)::LoadImage(NULL,"plmm.bmp",IMAGE_BITMAP,40,40,LR_LOADFROMFILE);
dl = (HBITMAP)::LoadImage(NULL,"dl.bmp",IMAGE_BITMAP,40,40,LR_LOADFROMFILE);
::SelectObject(hdc,ssgg);
lpma->GetDC(&hdc1);
::BitBlt(hdc1,0,0,40,40,hdc,0,0,SRCCOPY);
lpma->ReleaseDC(hdc1);
key.dwColorSpaceHighValue=255;
lpma->SetColorKey(DDCKEY_SRCBLT,&key);
}
void DrawPic()
{
lpbb->BltFast(0,0,lpma,CRect(0,0,40,40),DDBLTFAST_WAIT);
lpzz->Flip(NULL,DDFLIP_WAIT);
}
void OnPaint()
{
CPaintDC d(this);
DrawPic();
}
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(MFrame,CFrameWnd)
ON_WM_TIMER()
ON_WM_PAINT()
ON_WM_CREATE()
ON_WM_KEYUP()
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
class MWin:public CWinApp{
public:
BOOL InitInstance()
{
MFrame *mframe;
mframe = new MFrame;
mframe->ShowWindow(3);
m_pMainWnd = mframe;
return TRUE;
}
};
MWin mwin;
把DrawPic里面的lpbb->BltFast(0,0,lpma,CRect(0,0,40,40),DDBLTFAST_WAIT);注释掉
就是黑屏了
不注释掉运行的时候会退出
真郁闷,不知道是什么原因