|
|
运行一下代码时,贴出的图是桌面背景,这是为什么呢?请那位大侠愿意用宝贵的时间给在下指正,谢谢
#include <windows.h>
#include <ddraw.h>
#include "ddutil.cpp"
LPDIRECTDRAW lpDD;
LPDIRECTDRAWSURFACE lpDDSPrimary;
LPDIRECTDRAWSURFACE lpDDSBack;
LPDIRECTDRAWSURFACE lpDDSOne;
LRESULT CALLBACK WndProc( HWND hwnd , UINT message , WPARAM wParam , LPARAM lParam)
{
switch(message)
{
case WM_PAINT:
break;
case WM_KEYDOWN:
if(wParam==VK_ESCAPE)
{
PostMessage(hwnd,WM_QUIT,TRUE,0);
}
if(wParam==VK_F3)
{
lpDDSPrimary->Flip(NULL,DDFLIP_WAIT);
}
break;
case WM_DESTROY:
if(lpDD != NULL)
{
if(lpDDSPrimary != NULL)
{
lpDDSPrimary->Release();
lpDDSPrimary=NULL;
}
lpDD->Release();
lpDD = NULL;
}
}
return DefWindowProc(hwnd,message,wParam,lParam);
};
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
MSG msg;
HWND hwnd;
WNDCLASS wc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hbrBackground =(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.hCursor=NULL;
wc.hIcon =NULL;
wc.hInstance=hInstance;
wc.lpfnWndProc =WndProc;
wc.lpszClassName="Window";
wc.lpszMenuName =NULL;
wc.style =CS_HREDRAW | CS_VREDRAW;
RegisterClass( &wc);
hwnd=CreateWindowEx(0,"window","window",WS_POPUP,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),NULL,NULL,hInstance,NULL);
if(!hwnd)
return FALSE;
ShowWindow(hwnd,nShowCmd);
UpdateWindow(hwnd);
LRESULT ddrval;
ddrval = DirectDrawCreate(NULL, &lpDD, NULL);
if(ddrval == DD_OK)
{
// lpDD 是一个可用的 DirectDraw 对象.
MessageBox(hwnd,"Can Create!","CAN",MB_OK);
}
else
{
// DirectDraw 对象不能被创建.
MessageBox(hwnd,"Can't Create!","CANNOT",MB_OK);
}
ddrval = lpDD->SetCooperativeLevel(hwnd, DDSCL_EXCLUSIVE |
DDSCL_FULLSCREEN);
if(ddrval == DD_OK)
{
// 独占模式成功.
MessageBox(hwnd,"Can Fullscreen","Create",MB_OK);
}
else
{
// 独占模式不成功.
// 应用程序仍可运行.
}
ddrval = lpDD->SetDisplayMode(640, 480, 8);
if(ddrval == DD_OK)
{
// 显示模式改变成功.
MessageBox(hwnd,"Can SetDisplay","Success",MB_OK);
}
else
{
// 显示模式不能被改变.
// 这种模式不被支持或
// 另一个程序取得了独占模式.
}
DDSURFACEDESC ddsd;
ddsd.dwSize =sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount =1;
ddrval =lpDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL);
if(ddrval == DD_OK)
{
// lpDDSPrimary 指向新页面.
MessageBox(hwnd,"To New Surface","OK",MB_OK);
}
else
{
// 页面未创建.
return FALSE;
}
ShowCursor(false);
DDSCAPS ddscaps;
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack);
if(ddrval == DD_OK)
{
// lpDDSBack 指向后台缓存.
MessageBox(hwnd,"To Back","OK",MB_OK);
}
else
{
return FALSE;
}
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwHeight = 480;
ddsd.dwWidth = 640;
ddrval = lpDD->CreateSurface(&ddsd, &lpDDSOne, NULL);
if(ddrval != DD_OK)
{
return FALSE;
}
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwHeight = 480;
ddsd.dwWidth = 640;
ddrval = lpDD->CreateSurface(&ddsd, &lpDDSOne, NULL);
if(ddrval != DD_OK)
{
return FALSE;
}
HBITMAP hbm;
// 装载位图资源.
hbm = (HBITMAP)LoadImage(NULL, "A.bmp",NULL, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if (hbm == NULL)
{
MessageBox(hwnd,"hbm==NULL","r",MB_OK);
return FALSE;
}
DDCopyBitmap(lpDDSOne, hbm, 0, 0, 640, 480);
DeleteObject(hbm);
RECT rect;
rect.top =0;
rect.bottom =0;
rect.left =640;
rect.right =480;
HRESULT h;
h=lpDDSBack->BltFast(0,0,lpDDSOne,&rect,DDBLTFAST_WAIT);
if(h==NULL)
MessageBox(hwnd,"NULL","S",MB_OK);
lpDDSPrimary->Flip(NULL,DDFLIP_WAIT);
while (GetMessage(&msg,hwnd,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
} |
|