mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-10-26 12:27:30 +00:00 
			
		
		
		
	Merge branch 'master' into docking
# Conflicts: # examples/example_win32_directx11/main.cpp # examples/example_win32_directx12/main.cpp # examples/example_win32_directx9/main.cpp # imgui.cpp
This commit is contained in:
		| @@ -15,102 +15,34 @@ static ID3D10Device*            g_pd3dDevice = NULL; | ||||
| static IDXGISwapChain*          g_pSwapChain = NULL; | ||||
| static ID3D10RenderTargetView*  g_mainRenderTargetView = NULL; | ||||
|  | ||||
| void CreateRenderTarget() | ||||
| { | ||||
|     ID3D10Texture2D* pBackBuffer; | ||||
|     g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer)); | ||||
|     g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_mainRenderTargetView); | ||||
|     pBackBuffer->Release(); | ||||
| } | ||||
|  | ||||
| void CleanupRenderTarget() | ||||
| { | ||||
|     if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = NULL; } | ||||
| } | ||||
|  | ||||
| HRESULT CreateDeviceD3D(HWND hWnd) | ||||
| { | ||||
|     // Setup swap chain | ||||
|     DXGI_SWAP_CHAIN_DESC sd; | ||||
|     ZeroMemory(&sd, sizeof(sd)); | ||||
|     sd.BufferCount = 2; | ||||
|     sd.BufferDesc.Width = 0; | ||||
|     sd.BufferDesc.Height = 0; | ||||
|     sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; | ||||
|     sd.BufferDesc.RefreshRate.Numerator = 60; | ||||
|     sd.BufferDesc.RefreshRate.Denominator = 1; | ||||
|     sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; | ||||
|     sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; | ||||
|     sd.OutputWindow = hWnd; | ||||
|     sd.SampleDesc.Count = 1; | ||||
|     sd.SampleDesc.Quality = 0; | ||||
|     sd.Windowed = TRUE; | ||||
|     sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; | ||||
|  | ||||
|     UINT createDeviceFlags = 0; | ||||
|     //createDeviceFlags |= D3D10_CREATE_DEVICE_DEBUG; | ||||
|     if (D3D10CreateDeviceAndSwapChain(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice) != S_OK) | ||||
|         return E_FAIL; | ||||
|  | ||||
|     CreateRenderTarget(); | ||||
|  | ||||
|     return S_OK; | ||||
| } | ||||
|  | ||||
| void CleanupDeviceD3D() | ||||
| { | ||||
|     CleanupRenderTarget(); | ||||
|     if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; } | ||||
|     if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; } | ||||
| } | ||||
|  | ||||
| extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); | ||||
| LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) | ||||
| { | ||||
|     if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) | ||||
|         return true; | ||||
|  | ||||
|     switch (msg) | ||||
|     { | ||||
|     case WM_SIZE: | ||||
|         if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED) | ||||
|         { | ||||
|             CleanupRenderTarget(); | ||||
|             g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, 0); | ||||
|             CreateRenderTarget(); | ||||
|         } | ||||
|         return 0; | ||||
|     case WM_SYSCOMMAND: | ||||
|         if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu | ||||
|             return 0; | ||||
|         break; | ||||
|     case WM_DESTROY: | ||||
|         PostQuitMessage(0); | ||||
|         return 0; | ||||
|     } | ||||
|     return DefWindowProc(hWnd, msg, wParam, lParam); | ||||
| } | ||||
| // Forward declarations of helper functions | ||||
| bool CreateDeviceD3D(HWND hWnd); | ||||
| void CleanupDeviceD3D(); | ||||
| void CreateRenderTarget(); | ||||
| void CleanupRenderTarget(); | ||||
| LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); | ||||
|  | ||||
| // Main code | ||||
| int main(int, char**) | ||||
| { | ||||
|     ImGui_ImplWin32_EnableDpiAwareness(); | ||||
|  | ||||
|     // Create application window | ||||
|     WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("ImGui Example"), NULL }; | ||||
|     RegisterClassEx(&wc); | ||||
|     HWND hwnd = CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX10 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL); | ||||
|     ::RegisterClassEx(&wc); | ||||
|     HWND hwnd = ::CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX10 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL); | ||||
|  | ||||
|     // Initialize Direct3D | ||||
|     if (CreateDeviceD3D(hwnd) < 0) | ||||
|     if (!CreateDeviceD3D(hwnd)) | ||||
|     { | ||||
|         CleanupDeviceD3D(); | ||||
|         UnregisterClass(wc.lpszClassName, wc.hInstance); | ||||
|         ::UnregisterClass(wc.lpszClassName, wc.hInstance); | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     // Show the window | ||||
|     ShowWindow(hwnd, SW_SHOWDEFAULT); | ||||
|     UpdateWindow(hwnd); | ||||
|     ::ShowWindow(hwnd, SW_SHOWDEFAULT); | ||||
|     ::UpdateWindow(hwnd); | ||||
|  | ||||
|     // Setup Dear ImGui context | ||||
|     IMGUI_CHECKVERSION(); | ||||
| @@ -154,6 +86,7 @@ int main(int, char**) | ||||
|     //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); | ||||
|     //IM_ASSERT(font != NULL); | ||||
|  | ||||
|     // Our state | ||||
|     bool show_demo_window = true; | ||||
|     bool show_another_window = false; | ||||
|     ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); | ||||
| @@ -168,10 +101,10 @@ int main(int, char**) | ||||
|         // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. | ||||
|         // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. | ||||
|         // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. | ||||
|         if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) | ||||
|         if (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) | ||||
|         { | ||||
|             TranslateMessage(&msg); | ||||
|             DispatchMessage(&msg); | ||||
|             ::TranslateMessage(&msg); | ||||
|             ::DispatchMessage(&msg); | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
| @@ -239,8 +172,86 @@ int main(int, char**) | ||||
|     ImGui::DestroyContext(); | ||||
|  | ||||
|     CleanupDeviceD3D(); | ||||
|     DestroyWindow(hwnd); | ||||
|     UnregisterClass(wc.lpszClassName, wc.hInstance); | ||||
|     ::DestroyWindow(hwnd); | ||||
|     ::UnregisterClass(wc.lpszClassName, wc.hInstance); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| // Helper functions | ||||
|  | ||||
| bool CreateDeviceD3D(HWND hWnd) | ||||
| { | ||||
|     // Setup swap chain | ||||
|     DXGI_SWAP_CHAIN_DESC sd; | ||||
|     ZeroMemory(&sd, sizeof(sd)); | ||||
|     sd.BufferCount = 2; | ||||
|     sd.BufferDesc.Width = 0; | ||||
|     sd.BufferDesc.Height = 0; | ||||
|     sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; | ||||
|     sd.BufferDesc.RefreshRate.Numerator = 60; | ||||
|     sd.BufferDesc.RefreshRate.Denominator = 1; | ||||
|     sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; | ||||
|     sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; | ||||
|     sd.OutputWindow = hWnd; | ||||
|     sd.SampleDesc.Count = 1; | ||||
|     sd.SampleDesc.Quality = 0; | ||||
|     sd.Windowed = TRUE; | ||||
|     sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; | ||||
|  | ||||
|     UINT createDeviceFlags = 0; | ||||
|     //createDeviceFlags |= D3D10_CREATE_DEVICE_DEBUG; | ||||
|     if (D3D10CreateDeviceAndSwapChain(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice) != S_OK) | ||||
|         return false; | ||||
|  | ||||
|     CreateRenderTarget(); | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| void CleanupDeviceD3D() | ||||
| { | ||||
|     CleanupRenderTarget(); | ||||
|     if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; } | ||||
|     if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; } | ||||
| } | ||||
|  | ||||
| void CreateRenderTarget() | ||||
| { | ||||
|     ID3D10Texture2D* pBackBuffer; | ||||
|     g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer)); | ||||
|     g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_mainRenderTargetView); | ||||
|     pBackBuffer->Release(); | ||||
| } | ||||
|  | ||||
| void CleanupRenderTarget() | ||||
| { | ||||
|     if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = NULL; } | ||||
| } | ||||
|  | ||||
| // Win32 message handler | ||||
| extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); | ||||
| LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) | ||||
| { | ||||
|     if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) | ||||
|         return true; | ||||
|  | ||||
|     switch (msg) | ||||
|     { | ||||
|     case WM_SIZE: | ||||
|         if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED) | ||||
|         { | ||||
|             CleanupRenderTarget(); | ||||
|             g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, 0); | ||||
|             CreateRenderTarget(); | ||||
|         } | ||||
|         return 0; | ||||
|     case WM_SYSCOMMAND: | ||||
|         if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu | ||||
|             return 0; | ||||
|         break; | ||||
|     case WM_DESTROY: | ||||
|         ::PostQuitMessage(0); | ||||
|         return 0; | ||||
|     } | ||||
|     return ::DefWindowProc(hWnd, msg, wParam, lParam); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 omar
					omar