游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2435|回复: 3

关于DirectDraw切换分辨率后黑屏

[复制链接]

1

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-11-21 17:03:00 | 显示全部楼层 |阅读模式
切换桌面的分辨率或是程序中改变分辨率(与初始化的时候的分辨率不相同)之后,游戏直接就黑屏了。
颜色深度没有改变都是32位的。
只是分辨率改了之后就黑屏了。
直接用Restore()会失败
请教下高手在切换分辨率后代码上需要做什么工作。

26

主题

417

帖子

476

积分

中级会员

总版主

Rank: 3Rank: 3

积分
476
发表于 2011-11-22 11:02:00 | 显示全部楼层

Re:关于DirectDraw切换分辨率后黑屏

建议检查是不是设备丢失了

42

主题

115

帖子

141

积分

注册会员

Rank: 2

积分
141
发表于 2011-11-23 20:31:00 | 显示全部楼层

Re:关于DirectDraw切换分辨率后黑屏

设备丢失

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2011-11-23 22:07:00 | 显示全部楼层

Re: 关于DirectDraw切换分辨率后黑屏

no1xbde: 关于DirectDraw切换分辨率后黑屏

切换桌面的分辨率或是程序中改变分辨率(与初始化的时候的分辨率不相同)之后,游戏直接就黑屏了。
颜色深度...


我给你一个我自己运行正确的示例:
(声明:我并不知道我这代码是否没有一点问题,只知道测试结果是正确的,即可以用alt+enter随意进行窗口和全屏切换)



  1. // 窗口/全屏模式切换
  2. void CRender::ToggleScreen(bool bWindow)
  3. {
  4.         if (!m_bInit)                                return;
  5.         if (bWindow == m_bWindowed)        return;

  6.         m_bWindowed = bWindow;

  7.         // 窗口模式
  8.         if (bWindow)
  9.         {
  10.                 m_pDirectDraw7->RestoreDisplayMode();

  11.                 SetWindowLong(m_hWnd, GWL_STYLE, m_Wnd_Style);
  12.                 ::MoveWindow(m_hWnd, m_Wnd_Rect.left, m_Wnd_Rect.top, m_Wnd_Rect.right-m_Wnd_Rect.left, m_Wnd_Rect.bottom-m_Wnd_Rect.top, true);

  13.                 CreateSurface();

  14.                 ::UpdateWindow(m_hWnd);
  15.                 ::ShowWindow(m_hWnd, SW_SHOWNORMAL);
  16.                 ::BringWindowToTop(m_hWnd);
  17.         }
  18.         // 全屏模式
  19.         else
  20.         {
  21.                 ::GetWindowRect(m_hWnd, &m_Wnd_Rect);                                // 记录窗口的屏幕位置
  22.                 m_Wnd_Style = ::GetWindowLong(m_hWnd, GWL_STYLE);        // 记录窗口样式

  23.                 // 改变指定窗口的属性
  24.                 SetWindowLong(m_hWnd, GWL_STYLE, WS_POPUP & ~WS_VISIBLE);

  25.                 ::MoveWindow(m_hWnd, 0, 0, m_ScreenWidth, m_ScreenHeight, true);
  26.                 ::UpdateWindow(m_hWnd);
  27.                 ::ShowWindow(m_hWnd, SW_SHOWNORMAL);
  28.                 ::BringWindowToTop(m_hWnd);

  29.                 // 设置显示模式
  30.                 if (FAILED(m_pDirectDraw7->SetDisplayMode(m_ScreenWidth, m_ScreenHeight, _SCREEN_BITS, 0, 0)))
  31.                         return;

  32.                 CreateSurface();
  33.         }

  34.         InitData();
  35. }

  36. // 创建主表面和后台表面
  37. BOOL CRender::CreateSurface()
  38. {
  39.         if (m_hWnd == NULL)                                                        return FALSE;
  40.         if (m_ScreenWidth==0 || m_ScreenHeight==0)        return FALSE;

  41.         ClearSurface();

  42.         // 窗口模式
  43.         if (m_bWindowed)
  44.         {
  45.                 // 设置协作等级
  46.                 if (FAILED(m_pDirectDraw7->SetCooperativeLevel(m_hWnd, DDSCL_NORMAL)))
  47.                         return FALSE;

  48.                 // 创建主表面
  49.                 DDSURFACEDESC2 surfaceDesc;
  50.                 memset(&surfaceDesc, 0, sizeof(surfaceDesc));
  51.                 surfaceDesc.dwSize                        = sizeof(surfaceDesc);
  52.                 surfaceDesc.dwFlags                        = DDSD_CAPS;                                // 表示ddsCaps 成员是有效的
  53.                 surfaceDesc.ddsCaps.dwCaps        = DDSCAPS_PRIMARYSURFACE;        // 表示要创建的是主表面

  54.                 if (FAILED(m_pDirectDraw7->CreateSurface(&surfaceDesc, &m_pDDPrimarySurface, NULL)))
  55.                         return FALSE;
  56.         }
  57.         // 全屏模式
  58.         else
  59.         {
  60.                 // 设置协作等级
  61.                 if (FAILED(m_pDirectDraw7->SetCooperativeLevel(m_hWnd, DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))
  62.                         return FALSE;

  63.                 // 创建主表面
  64.                 DDSURFACEDESC2 surfaceDesc;
  65.                 memset(&surfaceDesc, 0, sizeof(surfaceDesc));
  66.                 surfaceDesc.dwSize                                = sizeof(surfaceDesc);
  67.                 surfaceDesc.dwFlags                                = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
  68.                 surfaceDesc.ddsCaps.dwCaps                = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
  69.                 surfaceDesc.dwBackBufferCount        = 1;

  70.                 if (m_pDirectDraw7->CreateSurface(&surfaceDesc, &m_pDDPrimarySurface, NULL) != DD_OK)
  71.                         return FALSE;
  72.         }

  73.         // 设置裁剪器
  74.         if (FAILED(m_pDDPrimarySurface->SetClipper(m_pDDClipper)))
  75.                 return FALSE;

  76.         // 创建后台缓冲表面
  77.         DDSURFACEDESC2 surfaceDesc;
  78.         memset(&surfaceDesc, 0, sizeof(surfaceDesc));
  79.         surfaceDesc.dwSize                        = sizeof(surfaceDesc);
  80.         surfaceDesc.dwFlags                        = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;
  81.         surfaceDesc.ddsCaps.dwCaps        = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY;        // 使用系统内存创建表面。DDSCAPS_OFFSCREENPLAIN:创建屏外表面。就是不与主表面等翻转表面相关的表面,通常用于位图的缓冲
  82.         surfaceDesc.dwWidth                        = m_ScreenWidth;
  83.         surfaceDesc.dwHeight                = m_ScreenHeight;

  84.         if (m_pDirectDraw7->CreateSurface(&surfaceDesc, &m_pDDBackSurface, NULL) != DD_OK)
  85.                 return FALSE;

  86.         return TRUE;
  87. }

  88. void CRender::ClearSurface()
  89. {
  90.         if (m_pDDBackSurface != NULL)
  91.         {
  92.                 m_pDDBackSurface->Release();
  93.                 m_pDDBackSurface = NULL;
  94.         }
  95.         if (m_pDDPrimarySurface != NULL)
  96.         {
  97.                 m_pDDPrimarySurface->Release();
  98.                 m_pDDPrimarySurface = NULL;
  99.         }
  100. }

  101. // 调用的代码:
  102. ...
  103.         case WM_SYSKEYDOWN:
  104.                 switch(wParam)
  105.                 {
  106.                 case VK_RETURN:
  107.                         {
  108.                                 static bool bWindow = true;

  109.                                 if (CRender::s_pRender != NULL)
  110.                                 {
  111.                                         CRender::s_pRender->ToggleScreen(bWindow = !bWindow);
  112.                                 }
  113.                         }
  114.                         break;
  115.                 }
  116.                 break;
  117. ...
复制代码


其中有个InitData()函数我没有贴出来,里面是创建表面的内容。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-2 18:55

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表