主角登场——显示表面

显示在屏幕上的图像只不过是以某种格式存储在内存中的有色象素组成的矩阵,或是调色板化的或是RGB模式的。DirectDraw中有两种显示表面:主显示表面 和 从显示表面。   主显示表面直接对应于被显示卡光栅化的实际显存,且任何时候都是可见的。   从显示表面是比较灵活的,可以是任意大小,驻留在VRAM或者系统内存中的数据块。一般为了达到显示平滑的效果,总是会创建一个或两个从显示表面,他们和主显示表面有同样的色彩深度和几何分布。这称为双缓冲或者三缓冲。   那么怎么创建一个和你的显示模式同样大小的简单主显示表面呢?步骤如下: 填充一个DDSURFACEDESC2的数据结构,描述你所希望创建的显示表面。 调用IDIRECTDRAW7::CreateSurface()来创建显示表面。 对于DDSURFACEDESC2结构,我们只需要填充里面的部分成员。代码如下: LPDIRECTDRAWSURFACE7  lpddsprimary = NULL;DDSURFACEDESC2 ddsd;  memset(&ddsd, 0, sizeof(ddsd) ) ;   ddsd.dwSize = sizeof(ddsd);ddsd.dwFlags = DDSD_CAPS;  ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;    lpdd7->CreateSurface(&ddsd, &lpddsprimary, NULL);  对于不同的显示表面的创建,只需要修改DDSURFACEDESC2结构。具体可以查阅DirectX SDK。 接下来要做的就是对这个显示表面关联调色板(因为我们这里所讨论的是256色的情况,也是初学者容易开始的模式)。 代码如此简单: lpddsprimary->SetPalette(lpddpal);  这都要感谢DirectDraw的设计精良,给我们带来了如此简单的代码。 有了以上的一切,我们下来就可以到真正激动人心的时候了。我们可以干什么?来点看得见的东西——绘制象素 在此之前,我想对整个过程做一个小小的回顾:我们要绘制象素,需要先做些什么呢?首先必须建立DirectDraw对象,设置协作级别,设定一个显示模式,并创建至少一个主显示表面,然后你需要为他关联一个调色板(256色模式的情况)。对,就是那么简单。 我们要绘制象素,也就是写表面,就必须要先获得表面的控制权,并且告诉DirectX不能有其他的进程来访问。这也很容易,DirectDraw提供了加锁的功能。 代码也如此简单: memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd);   lpddsprimary->Lock(NULL,  // destination rect to lock                                &ddsd,       // address of struct to receive… Continue reading 主角登场——显示表面

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