@ -1,28 +1,32 @@
// dear imgui: standalone example application for OpenGL3 with Winapi
// If you are new to dear imgui, see examples/README.txt and documentation at the top of imgui.cpp.
// Dear ImGui: standalone example application for Win32 + OpenGL 3
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
// This is provided for completeness, however it is strogly recommended you use OpenGL with SDL or GLFW.
# include "imgui.h"
# include "imgui_impl_opengl3.h"
# include "imgui_impl_win32.h"
# ifndef WIN32_LEAN_AND_MEAN
# define WIN32_LEAN_AND_MEAN
# endif
# include <windows.h>
# include <GL/GL.h>
# include <tchar.h>
// Data stored per platform window
struct RendererData
{
HDC hDC ;
} ;
struct WGL_WindowData { HDC hDC ; } ;
// Data
HGLRC g_hRC ;
RendererData g_MainWindow ;
static HGLRC g_hRC ;
static WGL_WindowData g_MainWindow ;
static int g_Width ;
static int g_Height ;
// Forward declarations of helper functions
static bool CreateDeviceOpenGL3 ( HWND hWnd , RendererData * data ) ;
static void CleanupDeviceOpenGL3 ( HWND hWnd , RendererData * data ) ;
bool CreateDeviceWGL ( HWND hWnd , WGL_WindowData * data ) ;
void CleanupDeviceWGL ( HWND hWnd , WGL_WindowData * data ) ;
void ResetDeviceWGL ( ) ;
LRESULT WINAPI WndProc ( HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam ) ;
// Main code
@ -30,19 +34,18 @@ int main(int, char**)
{
// Create application window
//ImGui_ImplWin32_EnableDpiAwareness();
WNDCLASSEX wc = { sizeof ( WNDCLASSEX ) , CS_OWNDC , WndProc , 0L , 0L , GetModuleHandle ( NULL ) , NULL , NULL , NULL , NULL , _T ( " ImGui Example " ) , NULL } ;
: : RegisterClassEx ( & wc ) ;
HWND hwnd = : : CreateWindow ( wc . lpszClassName , _T ( " Dear ImGui Winapi+OpenGL3 Example " ) , WS_OVERLAPPEDWINDOW , 100 , 100 , 1280 , 800 , NULL , NULL , wc . hInstance , NULL ) ;
WNDCLASSEXW wc = { sizeof ( wc ) , CS_OWNDC , WndProc , 0L , 0L , GetModuleHandle ( NULL ) , NULL , NULL , NULL , NULL , L " ImGui Example " , NULL } ;
: : RegisterClassExW ( & wc ) ;
HWND hwnd = : : CreateWindowW ( wc . lpszClassName , L " Dear ImGui Win32+OpenGL3 Example " , WS_OVERLAPPEDWINDOW , 100 , 100 , 1280 , 800 , NULL , NULL , wc . hInstance , NULL ) ;
// Initialize OpenGL3
if ( ! CreateDeviceOpenGL3 ( hwnd , & g_MainWindow ) )
// Initialize OpenGL
if ( ! CreateDeviceWGL ( hwnd , & g_MainWindow ) )
{
CleanupDeviceOpenGL3 ( hwnd , & g_MainWindow ) ;
CleanupDeviceWGL ( hwnd , & g_MainWindow ) ;
: : DestroyWindow ( hwnd ) ;
: : UnregisterClass ( wc . lpszClassName , wc . hInstance ) ;
: : UnregisterClassW ( wc . lpszClassName , wc . hInstance ) ;
return 1 ;
}
wglMakeCurrent ( g_MainWindow . hDC , g_hRC ) ;
// Show the window
@ -60,7 +63,7 @@ int main(int, char**)
ImGui : : StyleColorsDark ( ) ;
//ImGui::StyleColorsClassic();
// Setup Platform/Renderer binding s
// Setup Platform/Renderer backend s
ImGui_ImplWin32_InitForOpenGL ( hwnd ) ;
ImGui_ImplOpenGL3_Init ( ) ;
@ -69,13 +72,14 @@ int main(int, char**)
// - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple.
// - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).
// - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.
// - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering.
// - Read 'docs/FONTS.md' for more instructions and details.
// - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ !
//io.Fonts->AddFontDefault();
//io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f);
//ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
//IM_ASSERT(font != NULL);
@ -85,21 +89,21 @@ int main(int, char**)
ImVec4 clear_color = ImVec4 ( 0.45f , 0.55f , 0.60f , 1.00f ) ;
// Main loop
MSG msg ;
ZeroMemory ( & msg , sizeof ( msg ) ) ;
while ( msg . message ! = WM_QUIT )
bool done = false ;
while ( ! done )
{
// Poll and handle messages (inputs, window resize, etc.)
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.
// - 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 ) )
// See the WndProc() function below for our to dispatch events to the Win32 backend.
MSG msg ;
while ( : : PeekMessage ( & msg , NULL , 0U , 0U , PM_REMOVE ) )
{
: : TranslateMessage ( & msg ) ;
: : DispatchMessage ( & msg ) ;
continue ;
if ( msg . message = = WM_QUIT )
done = true ;
}
if ( done )
break ;
// Start the Dear ImGui frame
ImGui_ImplOpenGL3_NewFrame ( ) ;
@ -110,7 +114,7 @@ int main(int, char**)
if ( show_demo_window )
ImGui : : ShowDemoWindow ( & show_demo_window ) ;
// 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window.
// 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window.
{
static float f = 0.0f ;
static int counter = 0 ;
@ -129,7 +133,7 @@ int main(int, char**)
ImGui : : SameLine ( ) ;
ImGui : : Text ( " counter = %d " , counter ) ;
ImGui : : Text ( " Application average %.3f ms/frame (%.1f FPS) " , 1000.0f / ImGu i: : GetIO ( ) . Framerate , ImGu i: : GetIO ( ) . Framerate ) ;
ImGui : : Text ( " Application average %.3f ms/frame (%.1f FPS) " , 1000.0f / io . Framerate , io . Framerate ) ;
ImGui : : End ( ) ;
}
@ -148,84 +152,62 @@ int main(int, char**)
glViewport ( 0 , 0 , g_Width , g_Height ) ;
glClearColor ( clear_color . x , clear_color . y , clear_color . z , clear_color . w ) ;
glClear ( GL_COLOR_BUFFER_BIT ) ;
// If you are using this code with non-legacy OpenGL header/contexts (which you should not, prefer using imgui_impl_opengl3.cpp!!),
// you may need to backup/reset/restore current shader using the commented lines below.
//GLint last_program;
//glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);
//glUseProgram(0);
ImGui_ImplOpenGL3_RenderDrawData ( ImGui : : GetDrawData ( ) ) ;
//glUseProgram(last_program);
SwapBuffers ( g_MainWindow . hDC ) ;
// Present
: : SwapBuffers ( g_MainWindow . hDC ) ;
}
ImGui_ImplOpenGL3_Shutdown ( ) ;
ImGui_ImplWin32_Shutdown ( ) ;
ImGui : : DestroyContext ( ) ;
CleanupDeviceOpenGL3 ( hwnd , & g_MainWindow ) ;
CleanupDeviceWGL ( hwnd , & g_MainWindow ) ;
wglDeleteContext ( g_hRC ) ;
: : DestroyWindow ( hwnd ) ;
: : UnregisterClass ( wc . lpszClassName , wc . hInstance ) ;
: : UnregisterClassW ( wc . lpszClassName , wc . hInstance ) ;
return 0 ;
}
static bool ActivateOpenGL3 ( HWND hWnd )
// Helper functions
bool CreateDeviceWGL ( HWND hWnd , WGL_WindowData * data )
{
HDC hDc = GetDC ( hWnd ) ;
HDC hDc = : : GetDC ( hWnd ) ;
PIXELFORMATDESCRIPTOR pfd = { 0 } ;
pfd . nSize = sizeof ( pfd ) ;
pfd . nVersion = 1 ;
pfd . dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER ;
pfd . iPixelType = PFD_TYPE_RGBA ;
pfd . cColorBits = 32 ;
int pf = ChoosePixelFormat ( hDc , & pfd ) ;
const int pf = : : ChoosePixelFormat ( hDc , & pfd ) ;
if ( pf = = 0 )
{
return false ;
}
if ( SetPixelFormat ( hDc , pf , & pfd ) = = FALSE )
{
return false ;
}
ReleaseDC ( hWnd , hDc ) ;
return true ;
}
// Helper functions
static bool CreateDeviceOpenGL3 ( HWND hWnd , RendererData * data )
{
if ( ! ActivateOpenGL3 ( hWnd ) )
if ( : : SetPixelFormat ( hDc , pf , & pfd ) = = FALSE )
return false ;
: : ReleaseDC ( hWnd , hDc ) ;
data - > hDC = GetDC ( hWnd ) ;
data - > hDC = : : GetDC ( hWnd ) ;
if ( ! g_hRC )
{
g_hRC = wglCreateContext ( data - > hDC ) ;
}
return true ;
}
static void CleanupDeviceOpenGL3 ( HWND hWnd , Renderer Data* data )
void CleanupDeviceWGL ( HWND hWnd , WGL_WindowData * data )
{
wglMakeCurrent ( NULL , NULL ) ;
ReleaseDC ( hWnd , data - > hDC ) ;
: : ReleaseDC ( hWnd , data - > hDC ) ;
}
// Forward declare message handler from imgui_impl_win32.cpp
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler ( HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam ) ;
// Win32 message handler
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data.
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data.
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
LRESULT WINAPI WndProc ( HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam )
{
if ( ImGui_ImplWin32_WndProcHandler ( hWnd , msg , wParam , lParam ) )