有关DirectDraw Overlay表面的问题

dkp999 2003-09-11 03:10:00
为什么通过以下的程序在我的电脑中创建DrectDraw Overlay表面就会出错呢?
还请各位高手赐教啊?
//DDrawInit()
void DDrawInit()
{
HRESULT ddrval;

DDPIXELFORMAT g_ddpfOverlayFormats[] = {
{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0x7C00, 0x03e0, 0x001F, 0}, // 16-bit RGB 5:5:5
{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0xF800, 0x07e0, 0x001F, 0}, // 16-bit RGB 5:6:5
{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('U','Y','V','Y'),0,0,0,0,0}, // UYVY
{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('Y','U','Y','2'),0,0,0,0,0}, // YUY2
};
//
ddrval=DirectDrawCreateEx(NULL,(void**)&lpDD7,IID_IDirectDraw7,NULL);
if(ddrval != DD_OK) DDrawInitFailed(hWnd,ddrval,"DirectDrawCreateEx() call failed!");
//
// ddrval=lpDD7->SetCooperativeLevel(hWnd, DDSCL_NORMAL);
ddrval=lpDD7->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE ¦DDSCL_FULLSCREEN);
if(ddrval != DD_OK) DDrawInitFailed(hWnd,ddrval,"SetCooperativeLevel() call failed!");

//
ddrval=lpDD7->SetDisplayMode(1024,768,32,0, DDSDM_STANDARDVGAMODE);
if(ddrval !=DD_OK) DDrawInitFailed(hWnd,ddrval,"SetDisplayMode() call failed!");

// Create the primary surface
ZeroMemory(&ddsd, sizeof(ddsd)); // Fill structure with zeros
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

ddrval=lpDD7->CreateSurface(&ddsd, &lpDDSPrimary, NULL);
if (ddrval != DD_OK) DDrawInitFailed(hWnd, ddrval,"CreateSurface() Primary call failed");

//create overlay surface
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags= DDSD_CAPS ¦ DDSD_HEIGHT ¦ DDSD_WIDTH ¦ DDSD_PIXELFORMAT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OVERLAY ¦ DDSCAPS_VIDEOMEMORY;
ddsd.dwHeight = 576;
ddsd.dwWidth = 704;

memset(&ddsd.ddpfPixelFormat, 0, sizeof(DDPIXELFORMAT));
ddsd.ddpfPixelFormat = g_ddpfOverlayFormats[0];
//妈的RGB象素格式的就是不对,为什么?

ddrval = lpDD7->CreateSurface(&ddsd, &lpDDSOverlay, NULL);
if (ddrval != DD_OK) DDrawInitFailed(hWnd, ddrval,"Overlay surface creation failed");
}

//DDrawInitFailed()
HRESULT DDrawInitFailed(HWND hWnd,HRESULT hRet,LPCTSTR szError)
{
// char szBuffer[128];
// sprintf(szBuffer,szError);
DDrawFree();
MessageBox(hWnd,szError, "DirectDraw InWin Demo", MB_OK);
DestroyWindow(hWnd);
return hRet;
}
...全文
243 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Analyst 2003-10-29
  • 打赏
  • 举报
回复
Overlay只支持YUV格式
Lucker_520 2003-10-29
  • 打赏
  • 举报
回复
这个要驱动和硬件支持的,只有少数显卡支持RGB的Overlay的
dkp999 2003-09-15
  • 打赏
  • 举报
回复
为什么用DirectDraw不能创建RGB格式的Overlay表面呢?
dkp999 2003-09-12
  • 打赏
  • 举报
回复
好象没有听说过Overlay表面不支持RGB象素格式的说法哦
dkp999 2003-09-12
  • 打赏
  • 举报
回复
到底有没有谁知道为什么啊?
寻开心 2003-09-11
  • 打赏
  • 举报
回复
检测overlay方式是否支持这种格式
寻开心 2003-09-11
  • 打赏
  • 举报
回复
检测一下,看看是不是你的显示卡不支持该格式呢
在嵌入式Linux下,设备树(device tree)用来描述硬件平台的各种资源,Linux内核在启动过程中,会解析设备树,获取各种硬件资源来初始化硬件。设备树的overlay功能是指可以在系统运行期间动态修改设备树。一般情况下,如上图所示,设备树经过DTC编译器编译为二进制的hello.dtb文件,加载到内存,随Linux内核一起启动后,一般就无法更改了。如果我们想修改设备树,需要修改hello.dts文件文件,重新编译成二进制文件:hello.dtb,然后重新启动内核,重新解析。有了设备树的overlay功能,省去了设备树的重新编译和内核重启,我们可以直接编写一个设备树插件:overlay.dts,编译成overlay.dtbo后,直接给设备树“打补丁”,在运行期间就可以动态添加节点、修改节点...设备树的overlay功能,在很多场合都会用得到,会让我们的开发更加方便:外界插拔设备,无法在设备树中预先描述:耳机树莓派 + FPGA开发板基于I2C的温度传感器管脚的重新配置:PIN multiplexing修改bootcmd、分区...设备树的overlay功能,目前还没有加入到内核mainline(linux-5.10.x),但目前有些开发板和配套的BSP已经支持了,支持在系统运行期间动态修改设备树文件。如果你手头的开发板或内核平台还没有支持device tree overlay,可以学习本期课程,学习内核中设备树overlay的实现原理,如何给内核打补丁,使内核支持设备树的overlay功能。有了本期课程的学习基础,明白了设备树overlay的实现原理和运行机制,你就可以尝试在自己的开发板平台上实现这个功能了。本期课程的主要内容如下:在开发板上如何实现设备树的overlay功能Configfs文件系统的配置与挂载Configfs编程接口如何编写设备树 overlay插件设备树 overlay的编译和运行设备树overlay运行机制分析本期课程适合哪些人学习:嵌入式驱动工程师嵌入式BSP工程师嵌入式软件工程师想从事嵌入式开发的同学全网首家讲解设备树overlay的视频教程。   

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧