隐藏的BUG——SetDisplayMode()

最近用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 的对象参数,再进行调用。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值