Баг с установкой LPMINMAXINFO

240
11 декабря 2017, 15:43

Дело такое, при обработке сообщения WM_GETMINMAXINFO и установке значений LPMINMAXINFO, при первой установке, т.е. при запуске окна, все нормально, но стоит попробовать изменить размер, и переопределить данные передаваемые по ссылке, как окно начинает вести себя не адекватно. Ниже приведу пример, если потребуется весь класс окна приложу и его.

Если быть точнее то при установке максимально допустимого размера ширины/высоты. По данной ссылке можно наглядно посмотреть что происходит с окном

Обработка сообщения WM_GETMINMAXINFO:

case WM_GETMINMAXINFO:
{
    LPMINMAXINFO lp_mmi = reinterpret_cast<LPMINMAXINFO>(lparam);
    on_min_max_info(m_min_max_info_);
    if (m_min_max_info_.min_width != 0)
    {
        lp_mmi->ptMinTrackSize.x = m_min_max_info_.min_width;
    }
    if (m_min_max_info_.min_height != 0)
    {
        lp_mmi->ptMinTrackSize.y = m_min_max_info_.min_height;
    }
    if (m_min_max_info_.max_width != 0)
    {
        lp_mmi->ptMaxTrackSize.x = m_min_max_info_.max_width;
    }
    if (m_min_max_info_.max_height != 0)
    {
        lp_mmi->ptMaxTrackSize.y = m_min_max_info_.max_height;
    }
}
break;

Сам метод on_min_max_info это чисто виртуальная ф-ция.

virtual void on_min_max_info(window_min_max_data_t& min_max_data) = 0;

Структура:

struct window_min_max_data
{
    int min_width = 0;
    int min_height = 0;
    int max_width = 0;
    int max_height = 0;
    void* window_ptr = nullptr;
} typedef window_min_max_data_t;

Далее даю определение виртуальной ф-ции в дочернем классе.

void window::on_min_max_info(window_min_max_data_t& min_max_data)
{
    set_min_max_info(min_max_data, 0, 0, 640, 480, true);
}

Метод set_min_max_info:

void window::set_min_max_info(window_min_max_data_t& data, int max_w, int max_h, int min_w, int min_h,
                              const bool adjust_window_rect) const
{
    if (adjust_window_rect)
    {
        RECT r1 = { 0,0,min_w,min_h };
        RECT r2 = { 0,0,max_w, max_h };
        AdjustWindowRect(&r1, WS_OVERLAPPEDWINDOW, false);
        AdjustWindowRect(&r2, WS_OVERLAPPEDWINDOW, false);
        min_w = r1.right - r1.left;
        min_h = r1.bottom - r1.top;
        max_w = r2.right - r2.left;
        max_h = r2.bottom - r2.top;
    }
    memcpy_s(&data.min_width, sizeof data.min_width, &min_w, sizeof min_w);
    memcpy_s(&data.min_height, sizeof data.min_height, &min_h, sizeof min_h);
    memcpy_s(&data.max_width, sizeof data.max_width, &max_w, sizeof max_w);
    memcpy_s(&data.max_height, sizeof data.max_height, &max_h, sizeof max_h);
}

При этом, если задать реальное значение максимальной ширины/высоты, то все работает корректно. В чем может быть загвоздка то?

READ ALSO
Вывод изображения в ImageView

Вывод изображения в ImageView

Мне нужно чтобы юзер нажал на кнопку перешел в галерею выбрал изображения и он вставился в ImageViewНа эмуляторе все окей но при работа на устройстве...

233
Отправка картинки Андроид ява [дубликат]

Отправка картинки Андроид ява [дубликат]

Данный вопрос уже был задан и имеет решение:

289
Подсчет букв, символов и строк

Подсчет букв, символов и строк

Программа должна подсчитывать кол-во букв, символов и строкДля выхода из цикла есть оператор if, который при вводе пустой строки автоматически...

250
Разница между parallel() and parallelStream()?

Разница между parallel() and parallelStream()?

Какая разница между parallel() and parallelStream()? Что-то ни дока ни инфа в инете пока не помогаютЕсли это важно, то для примера возьмем обычный arraylist c 100 000 элементов

209