记录一些常用的代码功能段便于自己以后查找使用:

1.常用宏和函数

#define SafeRelease(lpx) if(lpx!=NULL){lpx->Release();lpx=NULL;}//释放COM
#define DD_Call(callcode) if(FAILED(callcode))return DD_FALSE    //安全创建
#define DD_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); }    //初始化结构体
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)    //按键判断
#define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
#define _RGB16BIT565(r,g,b) ((b & 31) + ((g & 63) << 5) + ((r & 31) << 11))//颜色设置
#define _RGB16BIT555(r,g,b) ((b & 31) + ((g & 31) << 5) + ((r & 31) << 10))
#define _RGB32BIT(a,r,g,b) ((b) + ((g) << 8) + ((r) << 16) + ((a) << 24))
/*每个像素16位,用此函数前先锁住表面。*/
inline void Plot_Pixel_Faster16(int x, int y,int red, int green, int blue,USHORT *video_buffer, int lpitch16)
{USHORT pixel = _RGB16BIT565(red,green,blue);video_buffer[x + y*lpitch16] = pixel;
}
inline void Plot_Pixel_32(int x, int y,int alpha,int red, int green, int blue,UINT *video_buffer, int lpitch32)
{    UINT pixel = _RGB32BIT(alpha,red,green,blue);video_buffer[x + y*lpitch32] = pixel;
}

2.初始化Device

bool graphicApp::initDevice(HWND hwnd,D3DDEVTYPE dType,bool windowed,int _width,int _height)
{width=_width;height=_height;IDirect3D9* _direct=0;HRESULT result=0;D3DCAPS9 caps;_direct=Direct3DCreate9(D3D_SDK_VERSION);if (!_direct){MessageBoxA(0,"create Directx filed!","create error",MB_OK);return false;}_direct->GetDeviceCaps(D3DADAPTER_DEFAULT,dType,&caps);int vp=0;if (caps.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLIGHT){vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;}else{vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;}D3DPRESENT_PARAMETERS d3pp;d3pp.BackBufferWidth=width;d3pp.BackBufferHeight=height;d3pp.BackBufferFormat=D3DFMT_A8R8G8B8;d3pp.BackBufferCount=1;d3pp.MultiSampleType=D3DMULTISAMPLE_NONE;d3pp.MultiSampleQuality=0;d3pp.SwapEffect=D3DSWAPEFFECT_DISCARD;d3pp.hDeviceWindow=hwnd;d3pp.Windowed=windowed;d3pp.EnableAutoDepthStencil=true;d3pp.AutoDepthStencilFormat=D3DFMT_D24S8;d3pp.Flags=0;d3pp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;d3pp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;result=_direct->CreateDevice(D3DADAPTER_DEFAULT,dType,hwnd,vp,&d3pp,&pDevice);if (FAILED(result)){MessageBoxA(0,"create Device filed!","create error",MB_OK);}_direct->Release();
return true;
}

3.设置协作等级

        //窗口模式if (FAILED(m_pDD->SetCooperativeLevel(m_hwnd, DDSCL_NORMAL)))return false;//全屏模式if (FAILED(m_pDD->SetCooperativeLevel(m_hwnd, DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))return false;

4.设置模式

        if (FAILED(m_pDD->SetDisplayMode(m_iWidth,m_iHeight,m_iBpp,0,0)))return false;

5.创建主页面

DDSURFACEDESC2 ddsd;        //页面描述
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
ddsd.dwFlags=DDSD_CAPS;
ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE;
hresult=m_pDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL);
if (hresult!=DD_OK)
  return false;

6.创建离屏页面

        //创建离屏表面DDSURFACEDESC2 ddsd;        //页面描述

memset(&ddsd,0,sizeof(ddsd));

ddsd.dwSize=sizeof(ddsd);

ddsd.dwFlags=DDSD_WIDTH|DDSD_HEIGHT|DDSD_CAPS;
ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth=m_iWidth;
ddsd.dwHeight=m_iHeight;
if(m_pDD->CreateSurface(&ddsd,&lpDDSTempBuffer,NULL)!=DD_OK)return false;

7.创建后背缓冲(只有在全屏模式下才可以)

DD_INIT_STRUCT(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;    // 增加DDSD_BACKBUFFERCOUNT 表明dwBackBufferCount有效
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE  | DDSCAPS_COMPLEX | DDSCAPS_FLIP; //  多了 DDSCAPS_COMPLEX | DDSCAPS_FLIP
ddsd.dwBackBufferCount = 1;    // 后备缓冲的个数
if (FAILED(lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL)))        return 0;
ddsd.ddsCaps.dwCaps    = DDSCAPS_BACKBUFFER;    // 请求一个后备缓冲
if (FAILED(lpddsprimary->GetAttachedSurface(&ddsd.ddsCaps, &lpddsback)))  // 得到后备缓冲         return 0;

8.创建裁剪器

//裁剪器
LPDIRECTDRAWCLIPPER lpDDClipper=NULL;
if (FAILED(m_pDD->CreateClipper(0,&lpDDClipper,NULL)))
return false;
if (FAILED(lpDDClipper->SetHWnd(0,m_hwnd)))
return false;
if (FAILED(lpDDSPrimary->SetClipper(lpDDClipper)))
return false;
LPRGNDATA region_data;

9.创建调色板

LPDIRECTDRAWPALETTE lpPalette;        //调色板
PALETTEENTRY palette[256];for(int i=1;i<255;i++)
{palette[i].peRed=rand()%256;palette[i].peGreen=rand()%256;palette[i].peBlue=rand()%256;palette[i].peFlags=PC_NOCOLLAPSE;
}
palette[0].peRed=0;
palette[0].peGreen=0;
palette[0].peBlue=0;
palette[0].peFlags=PC_NOCOLLAPSE;palette[255].peRed=255;
palette[255].peGreen=255;
palette[255].peBlue=255;
palette[255].peFlags=PC_NOCOLLAPSE;if (m_pDD->CreatePalette(DDPCAPS_8BIT|DDPCAPS_ALLOW256|DDPCAPS_INITIALIZE,palette,&lpPalette,NULL)!=DD_OK)
return false;
if (FAILED(lpDDSPrimary->SetPalette(lpPalette)))

10.用DDBLTFX的color填充表面

DDBLTFX ddfx;
DD_INIT_STRUCT(ddfx);
int red=rand()%256;
int green=rand()%256;
int blue=rand()%256;
ddfx.dwFillColor=_RGB32BIT(0,red,green,blue);
RECT dest_rect;
dest_rect.left=rand()%m_iWidth;
dest_rect.right=rand()%m_iWidth;
dest_rect.top=rand()%m_iHeight;
dest_rect.bottom=rand()%m_iHeight;dest_rect.left=250;
dest_rect.right=400;
dest_rect.top=250;
dest_rect.bottom=400;hret=lpDDSPrimary->Blt(&dest_rect,NULL,NULL,DDBLT_COLORFILL|DDBLT_WAIT,&ddfx);
if (hret!=DD_OK)
{char temp[512];//memset(temp,sizeof(temp));sprintf_s(temp,"Blt Error:%s",DXGetErrorString(hret));MessageBox(NULL,temp,"ERROR",0);return false;
}return false;

11.用另一个表面填充表面

RECT src_rect;
src_rect.left=0;
src_rect.top=0;
src_rect.right=m_iWidth;
src_rect.bottom=m_iHeight;//用客户端位置进行blt
RECT m_x2d_ClientRect;
GetClientRect(m_hwnd, &m_x2d_ClientRect);
ClientToScreen(m_hwnd, (LPPOINT)&m_x2d_ClientRect);
ClientToScreen(m_hwnd, (LPPOINT)&m_x2d_ClientRect+1);
hret=lpDDSPrimary->Blt(&m_x2d_ClientRect,lpBackBuffer,&src_rect,DDBLT_WAIT,NULL);if (hret!=DD_OK)
{char temp[512];sprintf_s(temp,"Blt Error:%s",DXGetErrorString(hret));MessageBox(NULL,temp,"ERROR",0);return false;
}

12.随机设置32位色深表面

DD_INIT_STRUCT(ddsd);if(FAILED(lpDDSPrimary->Lock(NULL,&ddsd,DDLOCK_SURFACEMEMORYPTR|DDLOCK_WAIT,NULL)))
return false;int memPitch=(int)(ddsd.lPitch>>2);
UNINT *video_buffer=(UNINT *)ddsd.lpSurface;for (int i=0;i<1000;i++)
{int x=rand()%m_iWidth;int y=rand()%m_iHeight;int red=rand()%256;int green=rand()%256;int blue=rand()%256;Plot_Pixel_32(x,y,0,red,green,blue,video_buffer,memPitch);
}
if(FAILED(lpDDSPrimary->Unlock(NULL)))
return false;

 13.HDC载入位图到表面

HBITMAP hBitmap;
hBitmap = (HBITMAP)LoadImage(NULL, "test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);HDC hdcImage;
HDC hdc;
BITMAP bm;lpBackBuffer->Restore();hdcImage = CreateCompatibleDC(NULL);
SelectObject(hdcImage, hBitmap);GetObject(hBitmap, sizeof(bm), &bm);lpBackBuffer->GetDC(&hdc);
BitBlt(hdc, 0, 0, 800, 600, hdcImage, 0, 0, SRCCOPY);
lpBackBuffer->ReleaseDC(hdc);
DeleteDC(hdcImage);

14.清空一个页面

DDBLTFX ddBltFx;
ddBltFx.dwSize=sizeof(DDBLTFX);
ddBltFx.dwFillPixel=0;
DDS[SBuffer]->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);

转载于:https://www.cnblogs.com/gamesky/archive/2012/07/28/2612865.html

DirectDraw 常用功能代码记录相关推荐

  1. ASP.NET中常用功能代码总结(3)——上传图片到数据库

    ASP.NET中常用功能代码总结(3)--上传图片到数据库<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:offi ...

  2. ASP.NET中常用功能代码总结(1)——发送邮件篇

    ASP.NET中常用功能代码总结(1)--发送邮件篇<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office: ...

  3. Wordpress模板主题中functions.php常用功能代码与常用插件[ 后台篇](持续收集整理)

    用Wordpress建站的初学者一定会需要用到的Wordpress模板主题中functions.php常用功能代码与常用插件.慢慢持续收集整理....... 目录 一.Wordpress模板主题中fu ...

  4. java poi 常用功能代码

    java poi 常用功能代码(适用于XSSFWorkbook:Excel2007后的版本,扩展名是.xlsx) Excel验证公式 =AND(H8>0,OR(H8=INT(H8),LEN(H8 ...

  5. WPS excel VBA 常用功能代码

    VBA中单元格位移方法,解释: submy_offset (0,1).Select'当前单元格向左移动一格 (0,-1).Select'当前单元格向右移动一格 (1,0).Select'当前单元格向下 ...

  6. 美狐美颜SDK最常用功能代码解析

    当下,平台方接入美颜工具包甚至已经成为刚需,没有美颜SDK甚至都会极大程度影响到用户体验,对于主播则更为重要,这甚至会影响到平台的发展.如今,直播美颜工具在广大直播平台中时时刻刻发挥着重要的作用.那么 ...

  7. DatagridView 常用功能代码

    文章是飞鸽传书转载的,版权归原作者所有,作者是:liguangxi8 1.DatagridView自动编号 代码  private void dataGridView1_RowPostPaint(ob ...

  8. 常用运行代码记录(控制面板,命令行等)

    目录 1.cmd 最常用的cmd,打开命令行 2.control 打开控制面板 3.打开internet属性 win+R快捷键打开运行 1.cmd 最常用的cmd,打开命令行 2.control 打开 ...

  9. MapX常用功能代码逻辑

    例程参见DET中的CMapXOP类和CRoadAttrCompReplaceDlg类. 1. 创建控件 if ( !CMapX::Create( lpszWindowName , dwStyle , ...

最新文章

  1. 35个必备的wordpress插件
  2. 【django】路由传递参数
  3. VTK:PolyData之MergeSelections
  4. mybatis example处理and、or关系的方法
  5. java访问其它服务器_java – 多个客户端同时访问服务器
  6. mysql怎么同时输入多个值_mysql – 一个字段搜索多个值
  7. SQL将A表的现有数据添加到B表,通过A表现有数据更新B表
  8. win10鼠标指针修改
  9. 知识付费的多重属性与本质特征
  10. 网络随堂笔记2(计算机网络下三层硬件及拓扑结构)
  11. 互联网+餐饮:看李帅与面点王董事长张和平如何说
  12. 计算机不让更改所有的设置,虚拟机中为域内计算机设置统一主页并不允许域内用户修改(第四节)...
  13. 什么是cve什么是cwe_什么是CVE 2020 0601又名Curveball,为何如此危险
  14. java模拟京东登陆_requests+beautifulsoup模拟登陆京东
  15. 录音转文字怎么弄?分享三个快速录音转文字的方法
  16. 基于FPGA的地铁自助售票机设计
  17. mysql时间精确到毫秒
  18. Python+ESP32 快速上手(九、控制1602LCD屏幕显示内容
  19. python中的matplotlib怎么改变标题大小和图例的字体大小和线的线型与颜色和输出图片大小呢?
  20. 简易Lasso回归 R语言 变量含有分类变量处理

热门文章

  1. 计算机主机一直响,电脑机箱声音大一直嗡嗡响的原因及解决方法
  2. cozmo玩耍记录1
  3. WinCHM Pro入门及注意事项(.chm帮助文件制作)
  4. Mysql数据库事务:从未提交读—MVCC机制—Next-Key Lock,各种隔离级别及其解决对应问题的原理
  5. 81、水喷雾灭火系统的管道水压试验
  6. SGame 新加进程(1)
  7. 2016年湖北专升本考试C语言程序设计试卷答案(A卷) 《C语言程序设计》试卷 A卷
  8. 输入 URL 到页面渲染的整个流程
  9. c语言微信抢红包的随机算法,微信抢红包的算法实现(C++)
  10. ArcGIS创建地理处理包!让你制作的工具自由分享