关于DirectX的显示模式由16位升级至32位
之前也发过一个帖子:
http://topic.csdn.net/u/20111019/10/1fbfaacb-5b25-4836-ada7-646e22f07fb2.html
现在我说下详细的情况
现在手头有个游戏的资源编辑器的源码,由于时间比较早(01年的),所以是16位显示的。
1、不设置显示模式也就是说默认系统的32位显示效果如下:
由于32位显示感觉是被压扁了,所以右侧的字也显示出来了
设置显示模式16位显示如下所示:
创建Surface如下:
// 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显示设备释放时自行恢复).