![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Forsaken |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 30.12.2008 Репутация: нет Всего: 3 |
Здравствуйте
У меня возникло две проблемы, которые не знаю какими средствами решаются. Первая При перетаскивании окна за заголовок, само окно не перемещается, а появляется рамка (не знаю даже как ее назвать, она отрисовывается точками через пиксел), обозначающая контуры окна. Мне бы хотелось как-то управлять этой рамкой (изменять ее размер и положение). Допустим у меня есть главное окно (WS_OVERLAPPEDWINDOW) я хочу чтобы при перемещении его к правому краю, вот эта рамка могла как бы приклеится к левому краю рабочего стола, т.е. стать в высоту рабочего стола и прикрепится к краю.. почти как это делает QIP Infium 9030 (он приклеивается но размеры не меняет), а после отпускания кн. мыши, окно как обычно появляется на месте этой рамки. Если сказать коротко.., –скажите, пожалуйста, как управлять рамкой окна при перемещении? И вторая проблема. Подскажите, как можно перемещать и изменять размер окна сразу же без этой рамки (например, как это происходит изменение размера окна в Google Chrome, только хотелось бы понять как еще можно также и передвигать окошко) Хотя бы направьте меня в нужное направление. Буду очень рад, если поможете! |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 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 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Forsaken |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 30.12.2008 Репутация: нет Всего: 3 |
GremlinProg,
Большое спасибо Вам за подробнейший ответ! Скажите, пожалуйста еще, а почему нужно использовать SetWindowPos в место MoveWindow? Необоходимы какие-то дополнительные параметры? Это сообщение отредактировал(а) Forsaken - 16.5.2009, 14:02 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
использовать можно любую функцию позиционирования MoveWindow проще, по идее -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Forsaken |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 30.12.2008 Репутация: нет Всего: 3 |
GremlinProg,
Еще раз большое спасибо Вам за помощь! |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |