当前位置:首页 > 编程开发

DirectDraw简单用法

webgou16年前 (2010-10-15)编程开发2725
GDI:win32 gdi 与 DirectDraw 操作DIB的,DirectDraw 直接操作内存。 [CODE_LITE] //ce 6下面测试: IDirectDraw *pDraw; IDirectDrawSurface *pDFace; IDirectDrawSurface *pLayer; HRESULT hr; DDSURFACEDESC ddsd; RECT rect; dlgMain.GetWindowRect(&rect); DirectDrawCreate(NULL, &pDraw, NULL); pDraw->SetCooperativeLevel(dlgMain,DDSCL_NORMAL); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; hr = pDraw->CreateSurface(&ddsd, &pDFace,NULL); DDCAPS ddcaps; memset(&ddcaps, 0, sizeof(ddcaps)); hr = pDraw->GetCaps(&ddcaps,NULL); memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY; ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH |DDSD_PIXELFORMAT; ddsd.dwWidth = 800; ddsd.dwHeight = 480; ddsd.ddpfPixelFormat = ddpfOverlayFormats; hr = pDraw->CreateSurface(&ddsd, &pLayer,NULL); hr = pLayer->IsLost(); DDOVERLAYFX ofx; memset(&ofx, 0, sizeof(DDOVERLAYFX)); ofx.dwSize = sizeof(DDOVERLAYFX); ofx.dckSrcColorkey.dwColorSpaceLowValue = 0x0000F81F; ofx.dckSrcColorkey.dwColorSpaceHighValue = 0x0000; ofx.dwAlphaConstBitDepth = 8; ofx.dwAlphaConst = 0x50; RECT rt1= {0,0,400,480}; hr = pLayer->UpdateOverlay(&rt1, pDFace, &rt1,DDOVER_SHOW|DDOVER_KEYSRCOVERRIDE, &ofx); HDC hdc; hr = pLayer->GetDC(&hdc); FillRect(hdc,&rt1, (HBRUSH)GetStockObject(BLACK_BRUSH)); SetBkColor(hdc,TRANSPARENT); SetTextColor(hdc,0x0000F81F); DrawText(hdc,_T("pLayerpLayer pLayervpLayer "), -1, &rt1, 1); hr = pLayer->ReleaseDC(hdc); pLayer->Release(); pDFace->Release(); pDraw->Release(); [/CODE_LITE] 1.链接库 动态装载 typedef HRESULT (* DIRECTDRAWCREATE)( GUID FAR *lpGUID, LPDIRECTDRAW FAR *lplpDD, IUnknown FAR *pUnkOuter ); m_hModule=::LoadLibrary(_T("ddraw.dll")); m_pDirectDrawCreate= (DIRECTDRAWCREATE)::GetProcAddress(m_hModule,L"DirectDrawCreate"); 静态链接 #pragma comment(lib, "ddraw.lib") 调用DirectDrawCreate 2.GUID的使用 直接定义 const GUID g_IID_IDirectDraw ={0x9c59509a,0x39bd,0x11d1, 0x8c,0x4a,0x00,0xc0,0x4f,0xd9,0x30,0xc5}; 链接#pragma comment(lib, "dxguid.lib") QueryInterface IID_IDirectDraw4 3.创建主页面 // Create the main DirectDraw object LPDIRECTDRAW g_pDD; hRet = DirectDrawCreate(NULL, &g_pDD, NULL); hRet = g_pDD->QueryInterface(g_IID_IDirectDraw, (LPVOID *)&g_pDD); // Get normal mode hRet = g_pDD->SetCooperativeLevel(hWnd, DDSCL_NORMAL); memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; // creates a DirectDrawSurface object for this DirectDraw object. hRet = g_pDD->CreateSurface(&ddsd, &g_pDDSPrimary, NULL); 创建主页面无须指定像素格式和页面大小 4.页面的像素格式 //YUV4:1:1 DDPIXELFORMAT pixel_format= {sizeof(DDPIXELFORMAT), DDPF_FOURCC, MAKEFOURCC('Y','V','1','2'),0,0,0,0,0}; //RGB565 DDPIXELFORMAT ddpfOverlayFormats = {sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0xF800, 0x07e0, 0x001F, 0}; 5.创建OverLay页面 memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_FLIP | DDSCAPS_VIDEOMEMORY; ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_BACKBUFFERCOUNT | DDSD_PIXELFORMAT; ddsd.dwWidth = DDRAW_X; ddsd.dwHeight = DDRAW_Y; ddsd.dwBackBufferCount = 1;//有个后台页面 ddsd.ddpfPixelFormat = pixel_format; hRet = g_pDD->CreateSurface(&ddsd, &g_pDDSOverlay, NULL); 创建OverLay页面应该指定页面的大小(可以全屏),像素格式。 6.OverLay页面的显示与隐藏 void ShowOverLay() { DDOVERLAYFX ovfx = {0}; ovfx.dwSize = sizeof(DDOVERLAYFX); ovfx.dckSrcColorkey.dwColorSpaceLowValue = COLOR_KEY;//指定页面的透明色 ovfx.dckSrcColorkey.dwColorSpaceHighValue = COLOR_KEY; ovfx.dwAlphaConstBitDepth = 8;//指明alpha位宽度 ovfx.dwAlphaConst = 0x50;//alpha透明值 指明页面的透明度.16级. RECT rs; rs.left = 0; rs.top = 0; rs.right = DDRAW_X; rs.bottom = DDRAW_Y; DWORD dwUpdateFlags = DDOVER_KEYSRCOVERRIDE | DDOVER_SHOW; if(g_pDDSOverlay != NULL && g_pDDSOverlay->IsLost() == DD_OK) { HRESULT hret = g_pDDSOverlay->UpdateOverlay(&rs,g_pDDSPrimary,&rs,dwUpdateFlags,&ovfx); //将主页面和OverLay页面关联起来 if(hret != DD_OK) { printf("Update OverLay errorrn"); if(hret == DDERR_SURFACELOST) { g_pDDSOverlay->Restore(); } } } } dwUpdateFlags = DDOVER_HIDE即隐藏页面。 UpdateOverlay这个接口一般是在页面初始化后,显示,隐藏这三种状况下调用, 每次在页面上绘图后不必要调用UpdateOverlay,否则就会造成画面显示卡动,不连续。 7.在页面上绘图 在页面上绘图有两种方法 一是获取页面DC后,以GDI方式绘图 if( g_pDDSOverlay->GetDC(&hDC) == DD_OK) //进行DC绘图 g_pDDSOverlay->ReleaseDC(hDC); 第二种状况当知道页面的像素格式,Lock页面获取页面指针,直接操作页面存储区。 g_pDDSOverlay->Lock(NULL,&ddsd,0,NULL); BYTE *pFramePhyPtr = (LPBYTE)ddsd.lpSurface; int framesize = DDRAW_X * DDRAW_Y; memcpy(pFramePhyPtr,src[0],framesize); memcpy(pFramePhyPtr + framesize,src[2],framesize / 4); memcpy(pFramePhyPtr + framesize + framesize / 4,src[1], framesize / 4); g_pDDSOverlay->Unlock(NULL);//YUV4:1:1 8.遍历后台页面 EnumAttachedSurfaces enumerates all the surfaces attached to a given primary surface. 可以先到后台页面上绘制,然后Flip操作. 9.注意要点 不要频繁调用UpdateOverLay。 注意页面的像素格式与图像帧的像素格式的匹配, 为了加快显示速度,最好与显示驱动所支持的像素格式相同。 可以用后台页面和Flip操作,加快页面显示。 具体操作见资源中心的示例。

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=363

分享给朋友:

“DirectDraw简单用法” 的相关文章

用HttpClient来模拟浏览器GET POST

一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据等等。所访问的这些页面有的仅仅是一些普通的页面,有的需要用户登录后方可使用,或者需要认证以及是一些通过加密方式传输,例如HTTPS。目前我们使用的浏览器处理这些情况都不会构成问题。不过…

Android初体验一

今天,在windows下搭建Android开发环境,步聚比较简洁。昨晚在自已电脑上,由于ADSL网速原因,安装ADT时卡住了,今天在公司很快就搞定了:1.安装android sdk 2.下载安装eclipse ADT 3.调试其中的例子,运行AVD查看效果...…

Bitcoin 的基本原理

昨天读到了 Bitcoin 的中文介绍,觉得非常有意思。不过上面这篇文章解释的非常不靠谱,我花了一晚上去Bitcoin的官方网站 仔细研究了一下,总算理解了其原理。感觉非常有启发,尤其是对虚拟货币的流通和发行有许多借鉴意义。今天写这篇 Blog 理一下。...…

eclipse插件的三种安装方法

1、将插件直接拷贝到eclipse的plugins(有时候还包括features)目录下,然后重启一下eclipse,在eclipse的插件库中 (--˃Help-˃SoftWare Updates-˃Manager Configuration)就可以找到。重启的时候可以清除一下eclipse的缓存…

WinCE下直接启动自己应用程序的方法

WinCE下直接启动自己应用程序的方法    其实让一个程序在wince里启动和windows里差不多,直接设置其为启动项,这个有几个方法。一个就是制作一个快捷方式,指向我们的应用程序如app.exe,然后将快捷方式放到\windows\startup下面。 ...…

Android数据库相关代码解读(1)

昨天进行了GUI界面设计,感受了一下android初次设计的愉悦,今天接着学习其SQLite数据库试用,将昨天的例子中数据存到数库中,并读取查看一下。 具体看代码(原写的有点问题,再改写如下):1) Android数据库之库操作类:package com.topsun;  &nb…

评论列表

webgou
webgou

蛇有蛇路,蜈蚣有蜈蚣路。

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。