|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
17.12.2008, 18:01 | #1 |
Пользователь
Регистрация: 28.12.2006
Сообщений: 75
|
Перемещение через сообщение
Здраствуйте глубоко уважаемые жильци форума. Перейду сразу к делу.
Имею на форме объект допустим Panel1. есть задача перемещать ее по форме но необходимо организовать привязку к сетке. В идеальном варианте хотелось бы получить примерно тоже самое что в самой системе Delphi когда создаются объекты на форме. Пользуюсь процедурой Perform отправляя сообщение объекту таким образом panel1.Perform(WM_SYSCOMMAND, $F012 ,0); Дык вот как всетаки сделать привязку к сетке? Может есть какоенибудь другое хорошее решение? |
17.12.2008, 18:07 | #2 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
В обработчике сообщения этой панели выранивай полученные координаты и приближай их к ближайшему узлу сетки. Если не хочешь писать класс потомок TPanel, то перед передачей координат выравнивай их.
|
17.12.2008, 18:10 | #3 |
Пользователь
Регистрация: 28.12.2006
Сообщений: 75
|
Извените, а поподробней можно? как вызвать обработчик сообщений... вернее в каком месте и как?
|
17.12.2008, 18:53 | #4 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
panel1.Perform(...); - это и есть вызов обработчика сообщений.
в каком имеено именно месте ты передаёшь сообщение чтобы твоя панелька переместилась? давай сюда код Последний раз редактировалось rpy3uH; 17.12.2008 в 18:56. |
17.12.2008, 21:55 | #5 |
Пользователь
Регистрация: 28.12.2006
Сообщений: 75
|
да код обычный
Код:
При желании можно использовать событие OnClick Проблема в том как это сообщение отловить отредактировать и обратно послать. Еще возможно вы меня не поняли. Необходимо привязать к сетке не после перетаскивания а во время перетаскивания. Последний раз редактировалось rpy3uH; 18.12.2008 в 08:54. |
18.12.2008, 08:58 | #6 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
во-первых, посмотри описание сообщения
http://msdn.microsoft.com/en-us/libr...60(VS.85).aspx и указывай в параметре WParam одну из констант, которые там указаны. во-вторых, для перемещения контролов используй функцию SetWindowPos в-третьих, зачем извращаться через API функции когда у конпонента есть свойства Top, Left, Width, Height ? Последний раз редактировалось rpy3uH; 18.12.2008 в 09:01. |
18.12.2008, 16:39 | #7 |
Пользователь
Регистрация: 28.12.2006
Сообщений: 75
|
и так. начну все с начала
я делаю редактор объектов. объекты создаются удаляются перемещаются и изменяются в размерах. по полной аналогии как в среде разработки delphi мы вытаскиваем объекты и располагаем на форме. Создавать удалять перемещать и изменять размер я умею. Остается только наложить сетку. чтобы перемещение и изменение размера проходило скачкообразно. Процедура выравнивания по сетке должна выравнивать объекты не после того как перемести а во время перемещения объекта. Основной алгоритм таков. 1. Нажимаю на объект OnMouseDown 2. Перетаскиваю объет OnMouseMove 2.1 Выравниваю объект по сетке 3. Отпускаю кнопку мыши OnMouseUp Вот впринципе и все. Можно все это делать с помощью "Top, Left, Width, Height" Но придется обрабатывать три события OnMouseDown, OnMouseMove, OnMouseUp. Вводить дополнительные переменные типа Draw:boolean - перетаскивание активно X,Y:integer - координаты начала передвижения. получится что то типа этого: Код:
Код:
Код:
Преимущества: 1. Малый код 2. Полностью заменят выше описаннвй функции. Ничем не отличается от них. 3. Используется стандартная функция перемещения объектов любого типа. 4. Автоматически назначает граници перемещения мыши (к примеру только в пределах формы, в способе с тремя функциями это нужно делать по другому) 5. Если необходимо изменить объект то ему стоит послать тоже самое сообщение только с параметром $F001 - для изменения только левой границы $F002 - для изменения только правой границы $F003 - для изменения только верхней границы $F004 - для изменения левой и верхней границы $F005 - для изменения правой и верхней границы $F006 - для изменения только нижней границы $F007 - для изменения правой и нижней границы $F008 - для изменения правой и нижней границы Недостаток только одын. Незнаю как прехватить само перемещение так как таковое событие OnMouseMove прекращает свою работу после вызова Perform и продолжет только тогда когда закончено перетаcкивание объекта либо его изнение размера. Вот как раз за этим я и пришел на форум в надежде что вы мне поможите решить эту проблему Последний раз редактировалось rpy3uH; 18.12.2008 в 17:55. |
18.12.2008, 18:02 | #8 | |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
ещё раз повторяю: не надо извращаться и использовать цифры вместо буквенных констант. Ибо зачем люди мучались и описывали все эти константы в заголовочных файлах?
и вот объявления констант SC_*** Цитата:
|
|
18.12.2008, 18:43 | #9 |
Пользователь
Регистрация: 28.12.2006
Сообщений: 75
|
хорошо буду использовать буквенные константы если конечно покажите мне константу на код $F001 или $F002 ...
Ну и опять возвращаясь к проблеме. Никто ничего посоветовать не может? |
18.12.2008, 19:18 | #10 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
по документации, младшие 4 бита этих значений использовать нельзя, они используются системой внутренне. И по идее мы не должны отправлять это сообщение, это сообщение отправляет система.
По теме, создай свой класс, например TMyPanel = class (TPanel) в нём обрабатывай сообщение перемещения WM_MOVE функцию в классе объявляй вот так: procedure myproc(var Msg:TMessage); message WM_MOVE; и изменяй в нём полученные координаты, можно попробовать другие сообщения... Последний раз редактировалось rpy3uH; 18.12.2008 в 19:41. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
SSL через WinSock или через что? | Jolyk | Win Api | 2 | 07.06.2008 17:37 |
Icq сообщение | Marsik | Помощь студентам | 2 | 10.04.2008 04:22 |
Звуковое сообщение. | Небесный | Паскаль, Turbo Pascal, PascalABC.NET | 13 | 17.10.2007 12:24 |