最近用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,0,0)))
{
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 的对象参数,再进行调用。
以前写该程序时,不会出现如此问题,想了想应该是最近显卡进行了更新,使得电脑不得不放弃一些落后的东西。