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
// 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();
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();
June 23rd, 2010 at 9:38 am
Любопытно, для какой задачи такое может понадобиться?) Ну там с играми и 3д-заставками понятно, но врядли это твой случай) Разве что может быть для размещения каких-нибудь виджетов, но тоже не верится…
June 23rd, 2010 at 9:51 am
все банально, запоминание и востановление позиции главного окна на экране.
June 24th, 2010 at 12:51 am
Хм… А почему нельзя оставить на той же позиции, на которой был левый верхний угол приложения? Ну да, с изменившимся разрешением изменится пропорциональное расположение окна, но кто меняет разрешение – тот сам себе буратино и должен быть готов к последствиям) В смысле получается что ты пропорционально изменившемуся разрешению пересчитываешь положение окна, я так понял? Конечно звучит очень удобно, но как-то непривычно, и, что самое главное, вызывает неприятное такое предчувствие что такая сильно умная логика приложения еще может выйти боком своей непривычностью, а соответственно и неожиданностью. А неожиданность почти равна непредсказуемости. Хотя если приложение под мак, то я не знаю, я от него далек, может там это как раз в порядке вещей и имплементировано насквозь в весь софт системы.
June 24th, 2010 at 3:37 pm
Откуда там умная логика в такой просто задаче?:)
все просто – запоминаем х, у верхнего левого угла + высоту и ширину, при старте восстанавливаем.
Проблемы из жизни:
1. иногда в следствии каких-то сбоев (может пропадало питание), у пользователей места координат – появлялись очень левые цифры – редко но было.
2. был мой косяк – неправильно сохранял координаты, и на системах где был вертикальный и автоматически прячущийся таскбар – после каждого старта окно съезжала влево на ширину таскбара – в результате уходило в минуса
3. закрыли окно на втором мониторе, второй монитор сломался\забрали.
Во всех трех случаях пользователь получает иконку на таскбаре и отсутвие окна на экране (в видимой области) и напрягает саппорт.
Да и вообще разумное правиль – перед установкой каких-то значений, проверять их валидность 🙂
June 24th, 2010 at 4:42 pm
>>иногда в следствии каких-то сбоев (может пропадало питание), у пользователей места координат – появлялись очень левые цифры – редко но было.
А, ну так далеко я в своих рассуждениях конечно не заходил)
2 – прикольный баг)
>>Да и вообще разумное правиль – перед установкой каких-то значений, проверять их валидность
Ну в общем да, я просто думал что у тебя заумный перерасчет идет – типа пользователь изменил разрешение экрана на более высокое – и окно сместило координаты своей отправной точки в соответствующем масштабе)
June 24th, 2010 at 4:51 pm
да ну чо я вообще монстер 🙂
June 24th, 2010 at 7:42 pm
wxDisplay не?
June 24th, 2010 at 11:08 pm
не
September 19th, 2010 at 2:03 am
а чё не? я вот буквально вчера проверил его работу – замечательно работает на многомониторной конфигурации wxDisplay (правда проверял только под виндой).
September 19th, 2010 at 5:31 am
ой, я сейчас не помню что там не так с вхДисплей проверить не как. Но по моему он не возвращал то значение которое мне было надо.