Ограничение положения окна в рабочей области рабочего стола - PullRequest
3 голосов
/ 09 марта 2010

Я хочу разрешить пользователю перетаскивать мое окно Win32 только внутри рабочей области рабочего стола. Другими словами, они не должны иметь возможности вытягивать какую-либо часть окна за пределы монитора (ов), и при этом окно не должно перекрывать панель задач.

Я бы хотел сделать это таким образом, чтобы вызвать заикание. Обработка сообщений WM_MOVE и вызов MoveWindow () для изменения положения окна, если оно закрывается, работает, но мне не нравится эффект мерцания, вызванный MoveWindow ().

Я также попытался обработать WM_MOVING, который предотвращает необходимость вызова MoveWindow () путем изменения прямоугольника назначения до того, как на самом деле произойдет перемещение. Это решает проблему мерцания, но другая проблема, с которой я сталкиваюсь, заключается в том, что курсор иногда удаляется от окна, когда происходит перетаскивание, позволяя пользователю перетаскивать окно, когда курсор даже не находится внутри окна.

Как мне ограничить окно, не сталкиваясь с этими проблемами?

Ответы [ 4 ]

3 голосов
/ 09 марта 2010

Окна, в конечном счете, позиционируются через SetWindowPos API.

SetWindowPos начинается с проверки его параметров путем отправки размера окна или перемещения сообщения WM_WINDOWPOSCHANGING , а затем сообщения WM_WINDOWPOSCHANGED , уведомляющего обработчик окна об измененном размере и / или позиции .

DefWindowProc обработка этих сообщений заключается, в свою очередь, в отправке WM_GETMINMAXINFO, а затем WM_SIZE или WM_MOVE сообщений.

В любом случае, обрабатывайте WM_WINDOWPOSCHANGING для фильтрации как пользователя, так и кода на основе попыток позиционирования окна за пределы.

2 голосов
/ 10 марта 2010

Имейте в виду, что пользователи с настройками нескольких мониторов могут иметь рабочий стол с отрицательными координатами x и y или не прямоугольной формы. Кроме того, некоторые пользователи используют альтернативные оконные менеджеры, такие как LiteStep, которые реализуют виртуальные рабочие столы, перемещая их за пределы экрана; если вы попытаетесь бороться с этим, ваше приложение сломается для этих пользователей.

0 голосов
/ 09 марта 2010

WM_GETMINMAXINFO - это то, что вы, похоже, ищете.

0 голосов
/ 09 марта 2010

Вы можете сделать это, обработав сообщение WM_MOVING и изменив RECT, на который указывает lParam.

lParam: указатель на структуру RECT с текущей позицией окна в экранных координатах. Чтобы изменить положение прямоугольника перетаскивания, приложение должно изменить элементы этой структуры.

вы также можете обработать WM_ENTERSIZEMOVE , чтобы узнать, когда окно начинает двигаться, и WM_EXITSIZEMOVE

...