ImGui、他のマウスイベントと重複して困ったので回避策。
マウスのコールバック関数が呼ばれている最中、ImGuiIO::WantCaptureMouseを調べtrueであればマウスがImGuiのウィンドウの内部にあることがわかる。
#include <cstdlib> #include <iostream> #include <Windows.h> #include <gl/GL.h> #include <GLFW/glfw3.h>
#include "imgui/imgui.h" #include "imgui/imgui_impl_glfw.h" #include "imgui/imgui_impl_opengl3.h"
#pragma comment(lib,"opengl32.lib") #pragma comment(lib,"glfw3.lib") #pragma warning(disable:4996) // マウスクリックを処理するコールバック関数 void mouse_button_callback(GLFWwindow* pwin, int button, int action, int mods) { ImGuiIO& io = ImGui::GetIO(); // マウスがImGuiのウィンドウ内にあるときは // この中を通らない if (io.WantCaptureMouse == false) { if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS) { printf("L - down\n"); } if (button == GLFW_MOUSE_BUTTON_RIGHT && action == GLFW_PRESS) { printf("R - down\n"); } if (button == GLFW_MOUSE_BUTTON_MIDDLE && action == GLFW_PRESS) { printf("M - down\n"); } } } // 背景色 float bg_color[3]; // マウス移動を処理するコールバック関数 void cursor_position_callback(GLFWwindow* window, double xpos, double ypos) { int display_w, display_h; glfwGetFramebufferSize(window, &display_w, &display_h); ImGuiIO& io = ImGui::GetIO();
// マウスがImGuiのウィンドウ内にあるときは // この中を通らない
if (io.WantCaptureMouse == false) { //背景色 bg_color[0] = xpos / display_w; bg_color[1] = ypos / display_h; bg_color[2] = bg_color[0] * bg_color[1]; } } int main() { if (!glfwInit()) { return -1; } const char* glsl_version = "#version 130"; glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); GLFWwindow* window = glfwCreateWindow(640, 480, "test", NULL, NULL); if (!window) { glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glfwSwapInterval(1); // 自分の作業用の目的 glfwSetMouseButtonCallback(window, mouse_button_callback); glfwSetCursorPosCallback(window, cursor_position_callback);
/////////////// /////////////// /////////////// IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; ImGui::StyleColorsDark(); ImGui_ImplGlfw_InitForOpenGL(window, true); ImGui_ImplOpenGL3_Init(glsl_version);
float x = 0.f, y = 0.f; char buffer[1024]; strcpy(buffer, "here"); bool pushed; while (!glfwWindowShouldClose(window)) { glfwPollEvents();
/////////////// /////////////// /////////////// // GUIを準備 ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); ImGui::SetNextWindowPos(ImVec2(30, 30)); ImGui::SetNextWindowSize(ImVec2(200, 250)); ImGui::Begin("Title"); ImGui::Text("input your message."); // ボタンを押されたフレームでpushedがtrueになる
pushed = ImGui::Button("push", ImVec2{ 0,0 }); ImGui::SameLine(); ImGui::InputText("", buffer, sizeof(buffer)); if (pushed) { printf("%s\n", buffer); } ImGui::End();
/////////////// /////////////// /////////////// int display_w, display_h; glfwGetFramebufferSize(window, &display_w, &display_h); glClearColor(bg_color[0], bg_color[1], bg_color[2], 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0, 0, display_w, display_h); ////////////// glColor3d(0.0, 0.0, 0.7); glBegin(GL_TRIANGLES); glVertex2d(-0.7, 0.7); glVertex2d(-0.7, -0.7); glVertex2d( 0.7, -0.0); glEnd();
/////////////// /////////////// /////////////// // GUIをレンダリング ImGui::Render(); ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
/////////////// /////////////// /////////////// glfwSwapBuffers(window); } /////////////// /////////////// /////////////// // Cleanup ImGui_ImplOpenGL3_Shutdown(); ImGui_ImplGlfw_Shutdown(); ImGui::DestroyContext(); glfwDestroyWindow(window); glfwTerminate(); return 0; }