DirectDraw支持很多不同的色彩深度,1,2,4,8,16,24,32。这里主要说一下8bpp,即256色,这也是初学者的好模式。 使用8位色彩模式要做的就是创建一个调色板并且告诉DirectDraw你希望使用它,步骤如下: 创建一个或多个调色板数据结构:大小为256的PALETTEENTRY数组。 从DirectDraw对象自身创建一个DirectDraw调色板接口IDirectDrawPalette对象。一般情况下这将直接映射到硬件VGA调色板寄存器。 将调色板关联到绘图表面。 以下给出一些参考代码: PALETTEENTRY palette[256]; // fill ’em up with colorpalette[0].peRed = 0; palette[0].peGreen = 0; palette[0].peBlue = 0;palette[0].peFlags = PC_NOCOLLAPSE;//……fill in the internal 1- 254palette[255].peRed = 255;palette[255].peGreen = 255;palette[255].peBlue = 255; palette[255].peFlags = PC_NOCOLLAPSE; LPDIRECTDRAWPALETTE lpddpal; lpdd7->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256 | DDPCAPS_INITIALIZE, palette, &lpddpal, NULL); 有了调色板,对于256色的图像显示就不是问题了。但是现在的问题是我们要在那里显示图像呢? 显示表面(Surface)——下一章,我们的主角上场的时候就要到了。
Category: Uncategorized
初次邂逅DirectDraw——IDirectDraw接口
创建一个主DirectDraw对象,并使用QueryInterface()方法来得到最新的IDirectDraw7接口,或是直接用DirectDrawCreateEx()函数直接创建一个DirectDraw7的接口。 创建一个DirectDraw 1.0的对象: LPDIRECTDRAW lpdd = NULL; DirectDrawCreate(NULL, &lpdd, NULL); 由于DirectX都是基于COM技术(恐怖的东西)的,所以在有了1.0版本的对象后我们可以通过其中重载的QueryInterface方法来查询最新的版本然后释放之前的旧版本: LPDIRECTDRAW7 lpdd7 = NULL; lpdd->QueryInterface(IID_IDirectDraw7, (LPVOID *)&lpdd7); lpdd->Release(); lpdd = NULL; 好了,现在开始,使用lpdd7对象的方法调用都是新的接口IDirectDraw7 以上代码其实并不是安全的,为了增强其安全性,我们还应该对其加上错误处理路径,可以使用微软提供的这两个宏: FAILED() SUCCEEDED() 另外,在COM中,其实只要有你需要的接口的接口标识符(IID),你就可以得到任何接口的指针。 CoInitialize(NULL); CoCreateInstance(&CLSID_DirectDraw, NULL, CLSCTX_ALL, &IID_IDirectDraw7, &lpdd7); lpdd7->Initialize(NULL); // NULL表示使用默认的视频设备 CoUninitialize(); 以上就是微软推荐的彻底的使用COM来创建DirectDraw对象的方法。 不过在DirectDraw 7.0版本中有一个更加好的函数可以帮我们完成所有的一切: DirectDrawCreateEx(NULL, (void **)&lpdd7, IID_IDirectDraw7, NULL); 就是那么简单,一个IDirectDraw7接口就已经创建好了。 总是别忘了要在程序结束前调用Release()。 接下来需要为它设置协作级别,当然,这一切都在接口的方法中。 lpdd7->SetCooperativeLevel(hWnd, DDSCL_NORMAL) //… Continue reading 初次邂逅DirectDraw——IDirectDraw接口
回顾Windows Programming(SDK篇)
要创建一个完全的Windows程序,大致要完成如下工作: 创建一个Windows类(WNDCLASSEX)。 创建一个事件句柄或者WinProc。 用Windows注册Windows类(RegisterClassEx)。 用前面创建的Windows类创建一个窗口(CreateWindowEx)。 创建一个能够从事件句柄获得或向事件句柄传递Windows信息的主事件循环。 然后进一步学会使用如下东西: 资源(图标,位图,光标,字符串,对话框,菜单) 菜单 GDI(GDI对象,DC,绘图函数) 消息 子控件(静态文本框,按钮,编辑框, 列表框,滚动条,单选复选按钮) 学会了这些,接下来我们可以学习一下我们一直接触的一个奇妙的东西——DirectDraw