隐藏的BUG——SetDisplayMode()

xiaoxiao2021-02-28  92

最近用Direct Draw进行窗口的绘图,发现一运行到某处,就会出现异常。如lpdd是nullptr。 说明该指针指向了空地址。 百思不得其解,于是乎一遍一遍地调试该函数块,还是没发现如何解决问题。然后再像“栈”一样,后入先出地慢慢地调试,终于找到了这个隐藏的小BUG——SetDisplayMode(). Code:

//........ LPDIRECTDRAW7 lpdd=NULL; //Create IDirectDraw interface 7.0 object if(FAILED(DirectDrawCreateEx(NULL,(void **)&lpdd,IID_IDirectDraw7,NULL))) { ::MessageBox(NULL,"DirectDraw object created error","Tips",NULL); return 0; } //set the cooperative level with Windows OS if(FAILED(lpdd->SetCooperativeLevel(handle,DDSCL_NORMAL))) { return 0; } //set display mode if(FAILED(lpdd->SetDisplayMode(640,480,8,00))) { return 0; }

多次调试都是到SetDisplayMode处,直接就return 0了。 MSDN中SetDisplayMode的函数原型:

HRESULT SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags); //一般后面两个参数默认为0

然后把宽度和高度分别改了改,(800,600),(1024,768),(1280,1024)还是一样直接return 0。 几经测试,把dwBPP第三个参数变为32即可,每个像素32bit. 经别人提示使用GetDisplayMode函数也可以达到一样的效果,不过要先进行设置DDSURFACEDESC2 的对象参数,再进行调用。

以前写该程序时,不会出现如此问题,想了想应该是最近显卡进行了更新,使得电脑不得不放弃一些落后的东西。

转载请注明原文地址: https://www.6miu.com/read-59764.html

最新回复(0)