wxWidgets определение размера экрана

June 22nd, 2010 Begemot Posted in Использование

В wxWidgets есть wxSystemSettings::GetMetric() который, кроме прочего, позволяет узнать разрешение экрана, но к сожалению не правильно 🙁

Проблемы появляются на мультимониторных конфигурациях. Вызов wxSystemSettings::GetMetric(wxSYS_SCREEN_X); дает нам ширину только первого монитора под Windows (сам проверял) и суммарную ширину обоих мониторов под Линуксом (сведенья из инета). Подозреваю что это баг, но разбиратся, формулировать и спорить некогда, поэтому просто написал воркараунд для себя

#ifdef __WIN32__  
    // wxSystemSettings::GetMetric does not support multy-monitor configuration at Windows, and return parameters only for first monitor, but it seems wots fine under Linux
    const int maxWidth = ::GetSystemMetrics(SM_CXVIRTUALSCREEN);
    const int maxHeight = ::GetSystemMetrics(SM_CYVIRTUALSCREEN);
#else
    const int maxWidth = wxSystemSettings::GetMetric(wxSYS_SCREEN_X);
    const int maxHeight = wxSystemSettings::GetMetric(wxSYS_SCREEN_Y);
#endif

Updated:
Эхх стало стыдно за плохой стиль:(

// wxSystemSettings::GetMetric does not support multy-monitor configuration at Windows and return parameters only for first monitor, but it seems works well under Linux
wxSize BegUtils::GetVirtualDisplayResolution()
{
#ifdef __WIN32__  
    return wxSize(::GetSystemMetrics(SM_CXVIRTUALSCREEN), ::GetSystemMetrics(SM_CYVIRTUALSCREEN));
#else
    return wxSize(wxSystemSettings::GetMetricwxSYS_SCREEN_X), wxSystemSettings::GetMetricwxSYS_SCREEN_Y));
#endif
}


...

    const wxSize resolution = BegUtils::GetVirtualDisplayResolution();
Related:

10 Responses to “wxWidgets определение размера экрана”

  1. Любопытно, для какой задачи такое может понадобиться?) Ну там с играми и 3д-заставками понятно, но врядли это твой случай) Разве что может быть для размещения каких-нибудь виджетов, но тоже не верится…

  2. все банально, запоминание и востановление позиции главного окна на экране.

  3. Хм… А почему нельзя оставить на той же позиции, на которой был левый верхний угол приложения? Ну да, с изменившимся разрешением изменится пропорциональное расположение окна, но кто меняет разрешение – тот сам себе буратино и должен быть готов к последствиям) В смысле получается что ты пропорционально изменившемуся разрешению пересчитываешь положение окна, я так понял? Конечно звучит очень удобно, но как-то непривычно, и, что самое главное, вызывает неприятное такое предчувствие что такая сильно умная логика приложения еще может выйти боком своей непривычностью, а соответственно и неожиданностью. А неожиданность почти равна непредсказуемости. Хотя если приложение под мак, то я не знаю, я от него далек, может там это как раз в порядке вещей и имплементировано насквозь в весь софт системы.

  4. Откуда там умная логика в такой просто задаче?:)
    все просто – запоминаем х, у верхнего левого угла + высоту и ширину, при старте восстанавливаем.
    Проблемы из жизни:
    1. иногда в следствии каких-то сбоев (может пропадало питание), у пользователей места координат – появлялись очень левые цифры – редко но было.
    2. был мой косяк – неправильно сохранял координаты, и на системах где был вертикальный и автоматически прячущийся таскбар – после каждого старта окно съезжала влево на ширину таскбара – в результате уходило в минуса
    3. закрыли окно на втором мониторе, второй монитор сломался\забрали.

    Во всех трех случаях пользователь получает иконку на таскбаре и отсутвие окна на экране (в видимой области) и напрягает саппорт.

    Да и вообще разумное правиль – перед установкой каких-то значений, проверять их валидность 🙂

  5. >>иногда в следствии каких-то сбоев (может пропадало питание), у пользователей места координат – появлялись очень левые цифры – редко но было.
    А, ну так далеко я в своих рассуждениях конечно не заходил)

    2 – прикольный баг)

    >>Да и вообще разумное правиль – перед установкой каких-то значений, проверять их валидность
    Ну в общем да, я просто думал что у тебя заумный перерасчет идет – типа пользователь изменил разрешение экрана на более высокое – и окно сместило координаты своей отправной точки в соответствующем масштабе)

  6. Ну в общем да, я просто думал что у тебя заумный перерасчет идет – типа пользователь изменил разрешение экрана на более высокое – и окно сместило координаты своей отправной точки в соответствующем масштабе)

    да ну чо я вообще монстер 🙂

  7. Подозреваю что это баг, но разбиратся, формулировать и спорить некогда, поэтому просто написал воркараунд для себя

    wxDisplay не?

  8. не

  9. а чё не? я вот буквально вчера проверил его работу – замечательно работает на многомониторной конфигурации wxDisplay (правда проверял только под виндой).

  10. ой, я сейчас не помню что там не так с вхДисплей проверить не как. Но по моему он не возвращал то значение которое мне было надо.