• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

IMGUI C++ OPENGL3

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
688 wizyt
pytanie zadane 7 kwietnia 2023 w C i C++ przez Dzieciak :) Początkujący (440 p.)
edycja 7 kwietnia 2023 przez Dzieciak :)

Hej potrzebuje pomocy napisałem kod który średnio działa. Chodzi o to aby okno GLWF zmieniało swoją pozycję, po kliknięciu na górną cześć okna. Tak jak to jest w innych aplikacjach typu chrome,Discord, nazwet CMD

Tylko że ja nie chcę w mojej aplikacji paska dekoracyjnego {    glfwWindowHint(GLFW_DECORATED, 0);  }

problem polega na tym:

1. okno jakby migocze

2.kursor myszy się "ślizga" bo oknie aplikacji

Chcę aby to działało jak na pasku dekoracyjnym, aby mysz się przyczepiała do okna i zmieniało odpowiednio pozycję okna

Tutaj mój kod

void ChangePos(GLFWwindow* window)
{
    static ImVec2 lastMousePos;
    static ImVec2 lastWindowPos;
    static bool isDraggingWindow = false;
    static ImVec2 windowDragPos;

    ImVec2 currentMousePos = ImGui::GetMousePos();

    bool isWindowHovered = ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup);

    if (ImGui::IsMouseDown(ImGuiMouseButton_Left) && (currentMousePos.y <= 110 || isWindowHovered)) {
        if (!isDraggingWindow) {
            isDraggingWindow = true;
            windowDragPos = currentMousePos;
            int windowPosX, windowPosY;
            glfwGetWindowPos(window, &windowPosX, &windowPosY);
            lastWindowPos.x = windowPosX;
            lastWindowPos.y = windowPosY;


        }
    }
    else {
        isDraggingWindow = false;
    }

    if (isDraggingWindow) {
        ImVec2 mouseDelta = currentMousePos - windowDragPos;


        ImVec2 newWindowPos = lastWindowPos + mouseDelta;

        glfwMakeContextCurrent(window);

        glfwSetWindowPos(window, (int)newWindowPos.x, (int)newWindowPos.y);

        lastWindowPos = newWindowPos;
        windowDragPos = currentMousePos;
    }
}


Napisałem jeszcze na szybko callback ale na nic


void cursor_enter_callback(GLFWwindow* window, int entered)
{
    if (entered) {
        glfwSetCursor(window, glfwCreateStandardCursor(GLFW_HRESIZE_CURSOR));
    }
    else {
        glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
    }
}

void cursor_position_callback(GLFWwindow* window, double xpos, double ypos)
{
    static double lastX = xpos;
    static double lastY = ypos;
    static bool isDragging = false;

    if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS && !isDragging && (ypos <= 110 || ImGui::IsWindowHovered())) {
        isDragging = true;
        lastX = xpos;
        lastY = ypos;
    }

    if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_RELEASE) {
        isDragging = false;
    }

    if (isDragging) {
        int winX, winY;
        glfwGetWindowPos(window, &winX, &winY);
        glfwSetWindowPos(window, winX + (xpos - lastX), winY + (ypos - lastY));
        lastX = xpos;
        lastY = ypos;
    }
}

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 127 wizyt
pytanie zadane 14 marca 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)
0 głosów
1 odpowiedź 281 wizyt
pytanie zadane 8 kwietnia 2020 w C i C++ przez Majster6918 Gaduła (4,030 p.)
0 głosów
1 odpowiedź 278 wizyt
pytanie zadane 15 maja 2020 w C i C++ przez Majster6918 Gaduła (4,030 p.)

93,434 zapytań

142,429 odpowiedzi

322,662 komentarzy

62,798 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...