进入色彩的世界——调色板

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)——下一章,我们的主角上场的时候就要到了。

初次邂逅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