#c #winapi
#c #winapi
Вопрос:
На моем ПК с Win7 у меня панель запуска работает вертикально, ее ширина составляет около 60 пикселей. В моем приложении win32 созданное окно всегда появляется, перекрывая стартовую панель, что выглядит плохо — я просто использую (0,0) в качестве верхней левой позиции окна.
Как я должен это делать, чтобы получить (0,0) относительно рабочего стола с учетом панели запуска? Есть ли флаг, или мне нужно вручную искать метрику?
Ответ №1:
Здесь есть несколько проблем. Вы не хотите использовать жестко заданное значение, например (0,0) . Это может быть даже не видно в системе с несколькими мониторами. Как вы обнаружили, вы должны стараться избегать перекрытия с панелью задач или другими панелями приложений. Если есть несколько мониторов, вам следует попробовать запустить на том мониторе, с которым пользователь взаимодействовал совсем недавно.
Есть простой способ сделать большую часть этого бесплатно. CW_USEDEFAULT
x
При вызове передайте в качестве y
координат и CreateWindow
. Это позволит оконному менеджеру выполнить тяжелую работу по отображению вашего окна в удобном месте.
Вы можете заставить систему сообщить вам координаты рабочей области. Рабочая область — это та часть рабочего стола, которая не содержит панели задач или других панелей приложений. SystemParametersInfo
Передача вызова SPI_GETWORKAREA
.
Извлекает размер рабочей области на основном мониторе отображения. Рабочая область — это часть экрана, не закрытая системной панелью задач или панелями инструментов рабочего стола приложения. Параметр pvParam должен указывать на
RECT
структуру, которая получает координаты рабочей области, выраженные в координатах виртуального экрана. Чтобы получить рабочую область монитора, отличного от основного монитора отображения, вызовитеGetMonitorInfo
функцию.
Комментарии:
1. Вы правы в отношении правильной поддержки нескольких мониторов, но в этом простом случае, я думаю
CW_USEDEFAULT
, это то, что мне нужно, чтобы избежать «незаконных» размещений? Можете ли вы подтвердить, что это лучше, чемSetWindowPlacement
ответ Раймонда?2. @John Я бы не решился сказать, что мое предложение было лучше, чем у кого-то вроде Raymond . Все зависит от того, чего вы пытаетесь достичь. Я думаю, что Рэймонд ответил на ваш прямой вопрос, тогда как я, возможно, посмотрел на него с более широкой точки зрения.
3. @John
CW_USEDEFAULT
— хорошее начало, но однажды вы можете захотеть улучшить свою программу, заставив ее запомнить, где она была, когда она закрывалась в последний раз, а затем возобновить работу в этом месте при следующем запуске.
Ответ №2:
Использование SetWindowPlacement
. Значение (0,0) для этой функции исключает панель задач и любые другие панели приложений.