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

本文提供了一个使用DirectDraw7创建全屏应用程序的简单代码示例,涵盖了初始化COM,创建窗口,设置合作级别,设置显示模式,创建主表面和后台表面,并在后台表面上绘制文字和线条的基本步骤。在程序结束时,还释放了相关资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 先初始化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();
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值