关于DirectX的显示模式由16位升级至32位
之前也发过一个帖子:
http://topic.csdn.net/u/20111019/10/1fbfaacb-5b25-4836-ada7-646e22f07fb2.html
现在我说下详细的情况
现在手头有个游戏的资源编辑器的源码,由于时间比较早(01年的),所以是16位显示的。
1、不设置显示模式也就是说默认系统的32位显示效果如下:
由于32位显示感觉是被压扁了,所以右侧的字也显示出来了
设置显示模式16位显示如下所示:
创建Surface如下:
- C/C++ code
// Create the primary surface ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize =sizeof(ddsd); ddsd.dwFlags =DDSD_CAPS; ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE; ddrval=lpDD4->CreateSurface(&ddsd,&lpDDSPrimary,NULL); //Back Surface ZeroMemory(&ddsd,sizeof(ddsd)); ddsd.dwSize =sizeof(ddsd); ddsd.dwFlags =DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH; ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY|DDSCAPS_3DDEVICE; ddsd.dwWidth =SCREENWIDTH; ddsd.dwHeight =SCREENHEIGHT; ddrval=lpDD4->CreateSurface(&ddsd,&lpDDSBack,NULL); //Buffer Surface ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize =sizeof(ddsd); ddsd.dwFlags =DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;//|DDSD_PIXELFORMAT; ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY; ddsd.dwWidth =SCREENWIDTH; ddsd.dwHeight =SCREENHEIGHT; ddrval=lpDD4->CreateSurface(&ddsd,&lpDDSBUF,NULL); //buffer surface ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize =sizeof(ddsd); ddsd.dwFlags =DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH; ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY; ddsd.dwWidth =MAXMAPWIDTH; ddsd.dwHeight =MAXMAPHEIGHT; ddrval=lpDD4->CreateSurface(&ddsd,&lpDDSMAP,NULL);
希望有经验的大侠能给指点下看看是什么地方的问题造成了,本人刚接触DX不久,谢谢
[解决办法]
应该是绘图的问题。和创建的表面大小还是后备表面没关系。
诸多绘图函数都是基于Pitch进行表面指针移动的,而Pitch又是以字节为单位,
在32位中,Pitch要比16的Pitch大两倍,绘画时原来的坐标就相当于被缩小了。
修改所以牵扯Pitch的绘画函数看是否能解决问题。
[解决办法]
没错,就是这个函数在按16来处理的.
这样改太麻烦了,可能你整个源码有80%以上的代码需要改动,最简单的办法是在程序初始化时,把显示器的显示模式改成16位的(相当于手动在控制面板中更改,但用DX函数更改会在DX显示设备释放时自行恢复).