Вопрос Как двигать окно имгуи без титл бара виндоус ? How can move a window Imgui without title bar?

Начинающий
Статус
Оффлайн
Регистрация
2 Июл 2021
Сообщения
6
Реакции[?]
0
Поинты[?]
0
Использую этот код.
Нужно двигать окно Imgui без титл бар винды .
hwnd = CreateWindow(wc.lpszClassName, _T("\x00\x00\x00\x00"), WS_OVERLAPPEDWINDOW, 100, 100, 658, 489, NULL, NULL, wc.hInstance, NULL);
Скиньте пару строк кода альтернативных или просто дополнение к выше написанному.
 
Трахов
Пользователь
Статус
Оффлайн
Регистрация
6 Фев 2020
Сообщения
490
Реакции[?]
87
Поинты[?]
2K
Использую этот код.
Нужно двигать окно Imgui без титл бар винды .
hwnd = CreateWindow(wc.lpszClassName, _T("\x00\x00\x00\x00"), WS_OVERLAPPEDWINDOW, 100, 100, 658, 489, NULL, NULL, wc.hInstance, NULL);
Скиньте пару строк кода альтернативных или просто дополнение к выше написанному.
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Начинающий
Статус
Оффлайн
Регистрация
10 Май 2019
Сообщения
36
Реакции[?]
5
Поинты[?]
0
Я сейчас подскажу в каком направлении копать, но это надо думать дальше как это применить можно

C++:
if (ImGui::IsMouseDown(ImGuiMouseButton_Left)) {
    ReleaseCapture();
    SendMessageW(hwnd, 0xA1, 0x2, 0);
}
Этот код при нажатии кнопки мыши в окне заставляет думать систему, будто ты нажал на обрамление окна и начал его перетаскивать. Вот.. Но проблема в том, что после этого невозможно взаимодействовать с тем, что находится внутри окна, надо создать некоторую область в меню, при нажатии на которую будет выполнять тот кусок кода.

 
Последнее редактирование:
артём диджитал дизайнер
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
490
Реакции[?]
477
Поинты[?]
66K
Использую этот код.
Нужно двигать окно Imgui без титл бар винды .
hwnd = CreateWindow(wc.lpszClassName, _T("\x00\x00\x00\x00"), WS_OVERLAPPEDWINDOW, 100, 100, 658, 489, NULL, NULL, wc.hInstance, NULL);
Скиньте пару строк кода альтернативных или просто дополнение к выше написанному.
я так понимаю у тебя десктоп, тогда вот:
во первых в создании окна заменяешь флаг
C++:
CreateWindow(wc.lpszClassName, _T("\x00\x00\x00\x00"), WS_OVERLAPPEDWINDOW, 100, 100, 658, 489, NULL, NULL, wc.hInstance, NULL);
на
C++:
CreateWindow(wc.lpszClassName, _T("\x00\x00\x00\x00"), WS_POPUP, 100, 100, 658, 489, NULL, NULL, wc.hInstance, NULL);
дальше лезешь в WndProc и если (насколько я понимаю) у тебя обычный имгуй, который ты юзаешь для десктоп приложухи, то меняй свой WndProc, на вот этот (ну или просто вставь кейсы WM_LBUTTONDOWN + WM_MOUSEMOVE) -
C++:
POINTS m_Pos;
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
        return true;

    switch (msg)
    {
    case WM_LBUTTONDOWN:
    {
        m_Pos = MAKEPOINTS(lParam);
        return 0;
    }
    case WM_MOUSEMOVE:
    {
        if (wParam == MK_LBUTTON)
        {
            POINTS p = MAKEPOINTS(lParam);

            RECT rect;
            GetWindowRect(hWnd, &rect);

            rect.left += p.x - m_Pos.x;
            rect.top += p.y - m_Pos.y; //      - 20 ниже - если есть кнопка закрытия окна внутри самого окна
            if (m_Pos.x >= 0 && m_Pos.x <= 700 - 20 && // 700 - ширина окна, ставь своё значение
                m_Pos.y >= 0 && m_Pos.y <= 30 /* или ImGui::GetFontSize() + ImGui::GetStyle().FramePadding.y * 4.0f*/) // насколько высокой будет рамка за которую можно потянуть окно
                SetWindowPos(hWnd, NULL, rect.left, rect.top, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOZORDER);
        }
        return 0;
    }
    case WM_SIZE:
        if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)
        {
            g_d3dpp.BackBufferWidth = LOWORD(lParam);
            g_d3dpp.BackBufferHeight = HIWORD(lParam);
            ResetDevice();
        }
        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);
}
изменить directx если он у тебя другой не составит труда даже новичку, так что как-то так, удачи
если что-то не понял - обращайся в личку форума, хайд или дс
 
Начинающий
Статус
Оффлайн
Регистрация
2 Июл 2021
Сообщения
6
Реакции[?]
0
Поинты[?]
0
я так понимаю у тебя десктоп, тогда вот:
во первых в создании окна заменяешь флаг
C++:
CreateWindow(wc.lpszClassName, _T("\x00\x00\x00\x00"), WS_OVERLAPPEDWINDOW, 100, 100, 658, 489, NULL, NULL, wc.hInstance, NULL);
на
C++:
CreateWindow(wc.lpszClassName, _T("\x00\x00\x00\x00"), WS_POPUP, 100, 100, 658, 489, NULL, NULL, wc.hInstance, NULL);
дальше лезешь в WndProc и если (насколько я понимаю) у тебя обычный имгуй, который ты юзаешь для десктоп приложухи, то меняй свой WndProc, на вот этот (ну или просто вставь кейсы WM_LBUTTONDOWN + WM_MOUSEMOVE) -
C++:
POINTS m_Pos;
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
        return true;

    switch (msg)
    {
    case WM_LBUTTONDOWN:
    {
        m_Pos = MAKEPOINTS(lParam);
        return 0;
    }
    case WM_MOUSEMOVE:
    {
        if (wParam == MK_LBUTTON)
        {
            POINTS p = MAKEPOINTS(lParam);

            RECT rect;
            GetWindowRect(hWnd, &rect);

            rect.left += p.x - m_Pos.x;
            rect.top += p.y - m_Pos.y; //      - 20 ниже - если есть кнопка закрытия окна внутри самого окна
            if (m_Pos.x >= 0 && m_Pos.x <= 700 - 20 && // 700 - ширина окна, ставь своё значение
                m_Pos.y >= 0 && m_Pos.y <= 30 /* или ImGui::GetFontSize() + ImGui::GetStyle().FramePadding.y * 4.0f*/) // насколько высокой будет рамка за которую можно потянуть окно
                SetWindowPos(hWnd, NULL, rect.left, rect.top, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOZORDER);
        }
        return 0;
    }
    case WM_SIZE:
        if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)
        {
            g_d3dpp.BackBufferWidth = LOWORD(lParam);
            g_d3dpp.BackBufferHeight = HIWORD(lParam);
            ResetDevice();
        }
        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);
}
изменить directx если он у тебя другой не составит труда даже новичку, так что как-то так, удачи
если что-то не понял - обращайся в личку форума, хайд или дс
<3
 
Сверху Снизу