Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Контролирование окна, при перемещении и ресайзе, Как можно управлять рамкой? 
V
    Опции темы
Forsaken
Дата 16.5.2009, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 30.12.2008

Репутация: нет
Всего: 3



Здравствуйте
У меня возникло две проблемы, которые не знаю какими средствами решаются.

Первая
При перетаскивании окна за заголовок, само окно не перемещается, а появляется рамка (не знаю даже как ее назвать, она отрисовывается точками через пиксел), обозначающая контуры окна. Мне бы хотелось как-то управлять этой рамкой (изменять ее размер и положение). Допустим у меня есть главное окно (WS_OVERLAPPEDWINDOW) я хочу чтобы при перемещении его к правому краю, вот эта рамка могла как бы приклеится к левому краю рабочего стола, т.е. стать в высоту рабочего стола и прикрепится к краю.. почти как это делает QIP Infium 9030 (он приклеивается но размеры не меняет), а после отпускания кн. мыши, окно как обычно появляется на месте этой рамки. Если сказать коротко.., –скажите, пожалуйста, как управлять рамкой окна при перемещении?

И вторая проблема. 
Подскажите, как можно перемещать и изменять размер окна сразу же без этой рамки (например, как это происходит изменение размера окна в Google Chrome, только хотелось бы понять как еще можно также и передвигать окошко)

Хотя бы направьте меня в нужное направление. 
Буду очень рад, если поможете!

PM MAIL   Вверх
GremlinProg
Дата 16.5.2009, 10:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



за рамку окна при перетаскивании отвечает флаг "Отображать содержимое окна при перетаскивании" в свойствах экрана, на вкладке "Оформление", "Эффекты..." это глобальный флаг системы, и менять его я не рекомендую, поскольку это личный выбор каждого пользователя

если все же так нужна рамка, то ее можно рисовать вручную
чтобы управлять рамкой, либо окном (в случае, когда флаг поднят), есть сообщения WM_ENTERSIZEMOVE, WM_EXITSIZEMOVE, WM_MOVING и WM_SIZING

на WM_ENTERSIZEMOVE нужно просто запомнить начальные размеры окна перед перетаскиванием, чтобы впоследствии, можно было их восстановить (если требуется кроме позиции окна сменить его размеры)

на WM_MOVING и WM_SIZING можно управлять размерами рамки (или окна) через параметр (RECT*)lParam
разница между сообщениями только в том, что WM_MOVING генерируется при перемещении окна, а WM_SIZING - при изменении любых его границ: левая, верхняя, лево-верхняя и т.п.

чтобы реализовать приклеивание окна, достаточно обработать WM_MOVING так, чтобы если какая-либо граница прямоугольника приближена по модулю к габаритам рабочей области, то нужно сдвинуть прямоугольник к этой границе
меру близости выбираем сами, обычно достаточно 10-15 пикселей

если нужно при этом еще установить габариты окна, то это так же можно сделать с прямоугольником, но тут следует учесть, что если окно не находится в области сближения, то эти размеры нужно восстановить (в те самые размеры, которые были сохранены на WM_ENTERSIZEMOVE)

без рамки это реализуется либо вручную, либо включается флаг "Отображать содержимое окна при перетаскивании" (что не желательно)

вручную, т.е. перехватывается WM_NCLBUTTONDOWN при hit-test'е равным HTCAPTION, устанавливается захват мыши на окно, запоминаются координаты курсора, относительно левого-верхнего угла окна, и на WM_MOUSEMOVE генерируется та же проверка, что и на WM_MOVING, за одним исключением: работаем не с прямоугольником, а с окном и меняем его через SetWindowPos


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Forsaken
Дата 16.5.2009, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 30.12.2008

Репутация: нет
Всего: 3



GremlinProg, 
Большое спасибо Вам за подробнейший ответ!
Скажите, пожалуйста еще, а почему нужно использовать SetWindowPos в место MoveWindow? Необоходимы какие-то дополнительные параметры?

Это сообщение отредактировал(а) Forsaken - 16.5.2009, 14:02
PM MAIL   Вверх
GremlinProg
Дата 16.5.2009, 14:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Forsaken @  16.5.2009,  16:00 Найти цитируемый пост)
а почему нужно использовать SetWindowPos в место MoveWindow

использовать можно любую функцию позиционирования
MoveWindow проще, по идее


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Forsaken
Дата 16.5.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 30.12.2008

Репутация: нет
Всего: 3



GremlinProg,
Еще раз большое спасибо Вам за помощь!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.