鱼C论坛

 找回密码
 立即注册
查看: 112|回复: 1

[已解决]求助:DirectX 9 全屏方式

[复制链接]
发表于 2024-10-31 09:26:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
例程游戏是 800×600窗口方式,点击标题栏“最大化”按钮(窗口右上角),游戏窗口能伸展到1440×900方式(显示器分辨率),未保持纵横比例。
教程中,没有说明是哪几行代码实现/设置的自动伸展。

我的目的是,800×600无窗模式,所有位置坐标都按这个模式设计。
按Alt+Enter键(或F12其它键),能自动切换到显示器分辨率(1024×768 1440×900 1920×1080  ……),不用设计人员为每种分辨率单独设计代码。
伸展到全屏方式,不用保持画面纵横比,不是最大化(没有窗口框)。

DirectX 9  (June 2010版) (不明白下载的June 2010版SDK,为什么还叫 9)
VS 2005/2013   C++

最佳答案
2024-10-31 09:27:16
要实现DirectX 9全屏切换功能,并且不保持纵横比,你可以参考以下步骤:

1. **初始化DirectX设备**:在初始化DirectX设备时,设置`D3DPRESENT_PARAMETERS`结构体的相关参数。

2. **切换全屏模式**:通过按键(如Alt+Enter或F12)来切换全屏模式。你需要在消息循环中捕获按键事件,并调用相应的函数来切换全屏。

3. **设置D3DPRESENT_PARAMETERS**:在切换全屏时,修改`D3DPRESENT_PARAMETERS`结构体的`Windowed`和`BackBufferWidth`、`BackBufferHeight`参数。

以下是一个简单的实现思路:

1. **初始化DirectX设备**:

D3DPRESENT_PARAMETERS d3dpp;
   ZeroMemory(&d3dpp, sizeof(d3dpp));
   d3dpp.Windowed = TRUE; // 初始为窗口模式
   d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
   d3dpp.hDeviceWindow = hWnd;
   d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
   d3dpp.BackBufferWidth = 800;
   d3dpp.BackBufferHeight = 600;

2. **切换全屏模式函数**:

void ToggleFullscreen()
   {
       static bool isFullscreen = false;
       isFullscreen = !isFullscreen;

       d3dpp.Windowed = !isFullscreen;
       if (isFullscreen)
       {
           d3dpp.BackBufferWidth = GetSystemMetrics(SM_CXSCREEN);
           d3dpp.BackBufferHeight = GetSystemMetrics(SM_CYSCREEN);
       }
       else
       {
           d3dpp.BackBufferWidth = 800;
           d3dpp.BackBufferHeight = 600;
       }

       // 重置设备
       if (d3dDevice)
       {
           d3dDevice->Reset(&d3dpp);
       }
   }

3. **捕获按键事件**:

   在消息循环中,捕获按键事件来调用`ToggleFullscreen`函数。

case WM_KEYDOWN:
       if (wParam == VK_RETURN && (GetKeyState(VK_MENU) & 0x8000)) // Alt+Enter
       {
           ToggleFullscreen();
       }
       break;

通过这种方式,你可以在不保持纵横比的情况下,实现DirectX 9的全屏切换功能。请根据你的具体需求和代码结构进行调整。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-31 09:27:16 | 显示全部楼层    本楼为最佳答案   
要实现DirectX 9全屏切换功能,并且不保持纵横比,你可以参考以下步骤:

1. **初始化DirectX设备**:在初始化DirectX设备时,设置`D3DPRESENT_PARAMETERS`结构体的相关参数。

2. **切换全屏模式**:通过按键(如Alt+Enter或F12)来切换全屏模式。你需要在消息循环中捕获按键事件,并调用相应的函数来切换全屏。

3. **设置D3DPRESENT_PARAMETERS**:在切换全屏时,修改`D3DPRESENT_PARAMETERS`结构体的`Windowed`和`BackBufferWidth`、`BackBufferHeight`参数。

以下是一个简单的实现思路:

1. **初始化DirectX设备**:

D3DPRESENT_PARAMETERS d3dpp;
   ZeroMemory(&d3dpp, sizeof(d3dpp));
   d3dpp.Windowed = TRUE; // 初始为窗口模式
   d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
   d3dpp.hDeviceWindow = hWnd;
   d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
   d3dpp.BackBufferWidth = 800;
   d3dpp.BackBufferHeight = 600;

2. **切换全屏模式函数**:

void ToggleFullscreen()
   {
       static bool isFullscreen = false;
       isFullscreen = !isFullscreen;

       d3dpp.Windowed = !isFullscreen;
       if (isFullscreen)
       {
           d3dpp.BackBufferWidth = GetSystemMetrics(SM_CXSCREEN);
           d3dpp.BackBufferHeight = GetSystemMetrics(SM_CYSCREEN);
       }
       else
       {
           d3dpp.BackBufferWidth = 800;
           d3dpp.BackBufferHeight = 600;
       }

       // 重置设备
       if (d3dDevice)
       {
           d3dDevice->Reset(&d3dpp);
       }
   }

3. **捕获按键事件**:

   在消息循环中,捕获按键事件来调用`ToggleFullscreen`函数。

case WM_KEYDOWN:
       if (wParam == VK_RETURN && (GetKeyState(VK_MENU) & 0x8000)) // Alt+Enter
       {
           ToggleFullscreen();
       }
       break;

通过这种方式,你可以在不保持纵横比的情况下,实现DirectX 9的全屏切换功能。请根据你的具体需求和代码结构进行调整。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 18:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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