我想通过按键F1的方式来控制开关渲染,并且我关闭的是程序本身的窗口渲染画面,而不是我们重新创建的窗口,你能帮我根据上面的代码重新按我的要求写一份新的代码吗
时间: 2024-04-16 16:28:52 浏览: 128
当按下 F1 键时,关闭程序本身的窗口渲染画面,而不是重新创建的窗口。下面是根据你的要求修改后的代码:
```cpp
#include <Windows.h>
#include <d3d11.h>
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
HWND g_hWnd;
ID3D11Device* g_pDevice = nullptr;
ID3D11DeviceContext* g_pDeviceContext = nullptr;
IDXGISwapChain* g_pSwapChain = nullptr;
bool g_isRendering = true;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 创建窗口
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WindowProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("DX11App"), NULL };
RegisterClassEx(&wc);
g_hWnd = CreateWindow(wc.lpszClassName, _T("DX11 Application"), WS_OVERLAPPEDWINDOW, 100, 100, 800, 600, NULL, NULL, wc.hInstance, NULL);
// 初始化 DirectX 设备和交换链
DXGI_SWAP_CHAIN_DESC swapChainDesc = { 0 };
swapChainDesc.BufferCount = 1;
swapChainDesc.BufferDesc.Width = 800;
swapChainDesc.BufferDesc.Height = 600;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.OutputWindow = g_hWnd;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.Windowed = TRUE;
D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, NULL, 0, D3D11_SDK_VERSION, &swapChainDesc, &g_pSwapChain, &g_pDevice, NULL, &g_pDeviceContext);
// 创建渲染目标视图
ID3D11RenderTargetView* pRenderTargetView = nullptr;
ID3D11Texture2D* pBackBuffer = nullptr;
g_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
g_pDevice->CreateRenderTargetView(pBackBuffer, NULL, &pRenderTargetView);
pBackBuffer->Release();
// 渲染循环
MSG msg;
while (true)
{
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
if (g_isRendering)
{
// 清空渲染目标视图
float clearColor[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; // RGBA颜色,这里设置为透明色
g_pDeviceContext->ClearRenderTargetView(pRenderTargetView, clearColor);
// 在这里添加你的渲染代码
// 呈现到屏幕
g_pSwapChain->Present(0, 0);
}
}
}
// 释放资源
pRenderTargetView->Release();
g_pDeviceContext->Release();
g_pSwapChain->Release();
g_pDevice->Release();
// 销毁窗口
DestroyWindow(g_hWnd);
UnregisterClass(wc.lpszClassName, wc.hInstance);
return 0;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CLOSE:
if (hWnd == g_hWnd) // 只在程序本身的窗口接收到关闭消息时关闭渲染
{
g_isRendering = false;
}
else
{
DestroyWindow(hWnd);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_KEYDOWN:
if (wParam == VK_F1)
{
g_isRendering = !g_isRendering; // 按下 F1 键切换渲染开关
}
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
```
在这个修改后的代码中,我们增加了对 F1 键的按下事件的处理。当按下 F1 键时,会切换 `g_isRendering` 的值来开启或关闭渲染。如果关闭的是程序本身的窗口(即 `hWnd` 与 `g_hWnd` 相同),则只关闭渲染,否则会销毁对应的窗口。
请注意,这段代码是在主循环中处理消息的,所以不会阻塞程序的运行。你可以在其他地方通过按下 F1 键来控制渲染的开关,关闭程序本身的窗口渲染画面,而不是重新创建的窗口。
阅读全文