| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Перетаскивание окна за рабочую область |
| Автор: ButtonOFF 6.4.2012, 19:06 | ||||||
Делаю так, перетаскивается рывками и криво
А окно у меня без заголовка и рамки ... кроме как рабочей области нет ничего
WM_NCHITTEST не предлагать, с таким кодом перетаскивается конечно отлично, НО не работают "WM_BUTTON-что-нибудь"
Желательно подправить первый вариант, кто делал помогите плз |
| Автор: Dem_max 6.4.2012, 19:20 | ||
|
| Автор: ButtonOFF 6.4.2012, 19:25 |
| Dem_max, Спасибо работает, но почти так же как и у меня. Когда я щелкаю и только начинаю тащить окно, оно резко срывается левым верхним углом под мышку... |
| Автор: Dem_max 6.4.2012, 19:32 | ||
|
| Автор: ButtonOFF 6.4.2012, 19:56 |
| Dem_max, Вообще запутался, так оно у меня не двигается вообще, в общем что-то тут с математикой, поидее берем позицию курсора, потом как-нибуть ищем дельту перемещения, и уже смещаем угол окна на эту дэльту... а это еще не самое сложное |
| Автор: Ne1tr1n0 6.4.2012, 23:38 | ||
А что-нить типа такого не пойдет?
|
| Автор: volatile 6.4.2012, 23:43 | ||
Все делается проще:
это всё! то есть, больше ничё не недо. код рабочий, взят из старого проекта. делал когда-то винамп-подобный интерфейс.. |
| Автор: Akira 7.4.2012, 00:03 |
| volatile Забыл ReleaseCapture() в некоторых приложениях без этой функи может быть ахтунг, а так сам таким пользуюсь только в место константы SC_MOVE + 2. нагляднее но не принципиально. |
| Автор: Dem_max 7.4.2012, 04:57 | ||||||||
| Ну в последнем приведенном мной коде смысл такой. Правда у меня случай когда неклиентской области совсем нету, есть только клиентская. Допустим у нас размер окна 100х100, мы ткнули мышкой в центр окна и хотим двигать. Так вот тут при нажатии левой кнопки мыши, узнаем положение курсора в клиентской области внутри окна. Получается для нашего примера 50х50 положение курсора.
При движении курсора, узнаем его позицию глобальную на рабочем столе. допустим курсор глобально в положении 500х500. Итоговое положение окна становится начальные координаты х = y = 500 - 50 = 450
Устанавливаем новое положение окна
Двигаем окно на позицию MoveWindow(m_hWnd,450, 450, 100, 100, FALSE); При этом окно находится на позиции 450х450, а курсор на позиции 500х500, так вот при движении курсора, положение окна будет изменяться, а положение курсора в окне будет постоянно в середине окна для нашего примера. Пример работы тут http://www.ir-max.ru/test/Server%20IR%20OSD%20Editor.zip Добавлено @ 05:00
Это не документированная функция, не стоит ее использовать. |
| Автор: Akira 7.4.2012, 11:51 |
| Dem_max SendMessage(hWnd, WM_SYSCOMMAND, 0xF012, 0); Это не документированная функция, не стоит ее использовать. С каких пор? Функа подробно описана в MSDN, константа определена в каком то хидере, сам мелкософт использует этот способ. |
| Автор: Dem_max 7.4.2012, 17:59 |
| Можно узнать в каком хидере объявлена константа 0xF012 ???? |
| Автор: volatile 7.4.2012, 23:48 |
Возможно, но эта фиговина работает на всех мастдаях начиная с 95 и вплоть до самых последних новаций от м$. Чего, кстати нельзя сказать о целой куче вполне документированных функций, поддержка которых прекратилась. Так что ... Добавлено через 2 минуты и 12 секунд http://msdn.microsoft.com/en-us/library/windows/desktop/ms646360(v=vs.85).aspx |
| Автор: Akira 8.4.2012, 00:34 |
| Dem_max >> Можно узнать в каком хидере объявлена константа 0xF012 ???? Каюсь, постоянно забываю что исходники NT в поставку студии не входят. volatile Способ норм. это же не ядерный андок и то там по большей части смена адресов, а так кочует из версии к версии и это способ давался в пере книг от мелкософт пресс (напамять не помню ибо их у них чуть меньше чем ***). |
| Автор: Dem_max 8.4.2012, 03:56 |
| У всех приведенных методов кроме моего есть один недостаток, окно нельзя переместить вверх за границу экрана !!! (это можно сделать влево, вправо, вниз), если тебе конечно этого не нужно, то можно воспользоваться простым методом. |