一个最简单的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();
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();
相关文章推荐
- 一个简单的循环多道程序内核代码 实现
- Linux内核分析课程--通过反汇编一个简单的c程序,分析汇编代码并理解计算机如何工作的
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 一个简单的Linux内核代码整合到一个文件的Java程序
- 完成一个简单的时间片轮转多道程序内核代码
- 20135202闫佳歆--week2 一个简单的时间片轮转多道程序内核代码及分析
- 一个简单的时间片轮转多道程序内核代码
- 一个简单的时间片轮转多道程序内核代码 的实现
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 跟一个从零开始学excel vba的新手的对话过程(简单程序实例)
- 例题:计算运费。c#语言基础,比较简单。看代码输入格式和方法。同样方法可以做一个 出租车打车的程序
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 计算机是如何执行程序的(以汇编一个简单的C程序,分析汇编代码为例)
- 【代码】微信小程序 简单一个页面,网上图片展示
- 推荐一个用C#代码生成JavsScript的简单程序集
- 云课堂 Linux内核分析 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- (作业1)将一个简单的C程序编译成汇编代码,讨论计算机是如何工作的进行
- 一个简单的时间片轮转多道程序内核代码
- 分析一个简单C程序的汇编代码,理解计算机是如何工作的