proof 发表于 2024-10-31 09:26:57

求助:DirectX 9 全屏方式

例程游戏是 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++

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 求助:DirectX 9 全屏方式