您的位置:首页 > 编程语言

一个最简单的DirectDraw新手程序代码(DDraw7)

2006-09-12 17:07 691 查看
// 先初始化COM
CoInitialize(NULL);

** CreateWindow

// 建窗口之后就可以初始化DDraw - 全屏的
if (FAILED(DirectDrawCreateEx(NULL, (LPVOID *) &g_lpDD, IID_IDirectDraw7, NULL)))
{
return FALSE;
}

if (FAILED(g_lpDD->SetCooperativeLevel(g_hWnd, DDSCL_ALLOWREBOOT | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)))
{
return FALSE;
}

if (FAILED(g_lpDD->SetDisplayMode(1024, 768, 16, 0/*refresh rate*/, DDSDM_STANDARDVGAMODE)))
{
return FALSE;
}

DDSURFACEDESC2 ddsd = {0}; // surface description structure
ddsd.dwSize = sizeof(ddsd);

// create primary surface
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
g_lpDD->CreateSurface(&ddsd, &g_lpddsPrimary, NULL);

// create a back surface
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE;
ddsd.dwWidth = 1024;
ddsd.dwHeight = 768;
if (FAILED(g_lpDD->CreateSurface(&ddsd, &g_lpddsStore, NULL)))
{
return FALSE;
}

if(FAILED(g_lpDD->CreateClipper(0, &pcClipper, NULL)))
{
return FALSE;
}

if(FAILED(pcClipper->SetHWnd(0, g_hWnd)))
{
pcClipper->Release();
return FALSE;
}

if(FAILED(g_lpddsPrimary->SetClipper(pcClipper)))
{
pcClipper->Release();
return FALSE;
}

// fill background with black
HDC dxHDC = NULL;
RECT rc = {0};
GetClientRect(g_hWnd, &rc);
g_lpddsStore->GetDC(&dxHDC);
FillRect(dxHDC, &rc, (HBRUSH) GetStockObject(BLACK_BRUSH));
g_lpddsStore->ReleaseDC(dxHDC);

**

// WM_PAINT消息处理
HDC dxHDC = NULL;
LPCTSTR lpszMessage = "This is a stinky Application";
RECT rt;
POINT p = {0, 0};

ClientToScreen(hWnd, &p);
rt.left = 0 + p.x;
rt.top = 0 + p.y;
rt.right = 1024 + p.x;
rt.bottom = 768 + p.y;

RECT rt2 = {100, 100, 200, 200};
g_lpddsStore->GetDC(&dxHDC);
SetTextColor(dxHDC, RGB(255, 0, 0));
TextOut(dxHDC, 20, 60, lpszMessage, lstrlen(lpszMessage));
SelectObject(dxHDC, (HPEN) GetStockObject(WHITE_PEN));
MoveToEx(dxHDC, 100, 100, NULL); LineTo(dxHDC, 200, 500);
g_lpddsStore->ReleaseDC(dxHDC);
dxHDC = NULL;

while (TRUE)
{
HRESULT hRet = g_lpddsPrimary->Blt(&rt, g_lpddsStore, NULL, DDBLT_WAIT, NULL);
if (hRet == DD_OK)
{
break;
}
else if (hRet == DDERR_SURFACELOST)
{
g_lpddsPrimary->Restore();
g_lpddsStore->Restore();
}
else if(hRet != DDERR_WASSTILLDRAWING)
{
break;
}
}

// 程序结束时不忘释放
pcClipper->Release();
g_lpddsPrimary->Release();
g_lpddsStore->Release();
g_lpDD->Release();
CoUninitialize();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐