![]() |
eXeL@B —› Программирование —› Перетаскивать окно за любую точку. |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 06 февраля 2009 22:04 · Поправил: Mavlyudov · Личное сообщение · #1 Если делать для стандартного приложения в делфи, то перетаскивание будет выглядеть вот так: public procedure ttt(var M:TMessage); message WM_NCHITTEST; end; ....................................... procedure TForm1.ttt(var M:TMessage); begin inherited; if M.Result = htClient then M.Result := htCaption; end; Но у меня консольное приложение, в котором я решил создать форму: form: TForm; form := TForm.Create(Application); ......... Как тут сделать перетаскивание??? нужно ведь как-то динамически привязать message к форме... Что-то типа ReleaseCapture; form.perform(WM_SysCommand, $F012, 0); не помогает.. ![]() |
|
Создано: 06 февраля 2009 22:19 · Личное сообщение · #2 |
|
Создано: 06 февраля 2009 22:19 · Личное сообщение · #3 |
|
Создано: 06 февраля 2009 22:35 · Поправил: Mavlyudov · Личное сообщение · #4 g-l-u-k Что-то я не вижу, куда обработчик вставить... Code:
![]() |
|
Создано: 06 февраля 2009 22:51 · Личное сообщение · #5 |
|
Создано: 06 февраля 2009 22:52 · Поправил: Mavlyudov · Личное сообщение · #6 |
|
Создано: 07 февраля 2009 02:23 · Личное сообщение · #7 |
|
Создано: 07 февраля 2009 02:43 · Поправил: Mavlyudov · Личное сообщение · #8 |
|
Создано: 07 февраля 2009 03:11 · Поправил: Halt · Личное сообщение · #9 Mavlyudov слушай если ты форму создаешь все равно руками дык сделай ее на WinAPi, чем прикручивать сюда оконную продцедуру.. которая к томуже раздует твое приложение на +400 кб минимум с другой стороны: вот как выгдялит создание формы на WinAPi Code:
@WindowProc продцедура обработки сообщений WinClass:TWinClass Code:
вариант №2 (я считаю он через ж.. ибо тащишь все...) Code:
работает или нет ХЗ но компилится... ![]() |
|
Создано: 07 февраля 2009 18:31 · Личное сообщение · #10 |
|
Создано: 07 февраля 2009 21:36 · Личное сообщение · #11 |
|
Создано: 08 февраля 2009 00:17 · Поправил: F_a_u_s_t · Личное сообщение · #12 Mavlyudov Я прекрасно понял о чем ты писал. ![]() Stack пишет : Люди если форма создается из экземпляра TForm значит OnMouseDown у нее уже есть. Просто его надо динамически присвоить. Конечно динамически присваивать надо если форма динамически создается. Ну или сразу создать форму а в ней создать консоль. Mavlyudov Кто тебе сказал что нельзя написать дерективу {$R *.dfm}? Тебя обманули. ![]() ![]() |
|
Создано: 08 февраля 2009 00:25 · Личное сообщение · #13 Mavlyudov Вот тебе для примера. Code:
![]() |
|
Создано: 08 февраля 2009 01:22 · Личное сообщение · #14 |
|
Создано: 08 февраля 2009 01:40 · Личное сообщение · #15 Mavlyudov А кто сделать тебе не дает? Или тебе обязательно динамически надо? Еще как вариант все это в либу перенисти и подключить к основной проге - консоли. Если динамически то и конструкторы,методы и процедуры тоже динамически надо обьявлять. Кстати в королевстве делфи была такая тема на форуме там давали несколько примеров для совмещения консоли и формы... если не потерли то там и лежит. ![]() |
|
Создано: 08 февраля 2009 02:04 · Личное сообщение · #16 Вот откомпиленный вариан с {$R *.dfm} : Halt 1 вариан тоже работает - проверял 2 не знаю не пробовал. А по нормальному имхо все таки это надо в либу выносить. ![]() ![]() |
|
Создано: 08 февраля 2009 12:04 · Личное сообщение · #17 |
|
Создано: 08 февраля 2009 23:01 · Личное сообщение · #18 |
|
Создано: 08 февраля 2009 23:07 · Личное сообщение · #19 |
|
Создано: 08 февраля 2009 23:19 · Поправил: Clerk · Личное сообщение · #20 Halt Это не извращение, а нормальный системный механизм; извращение это типа "TForm1.ttt(var M:TMessage)". Get~/SetWindowLong() позволяют получить/переопределить оконную процедуру, но только в контексте текущего процесса. Тоесть мы получаем указатель на оригинальный хэндлер, задаём свой. Далее мы обрабатываем как и скозал уже g-l-u-k сообщение WM_LBUTTONDOWN, посылая WM_NCLBUTTONDOWN(HTCAPTION), после чего передаём управление на оригинальный диспетчер. ![]() |
|
Создано: 08 февраля 2009 23:29 · Личное сообщение · #21 |
|
Создано: 09 февраля 2009 00:31 · Личное сообщение · #22 Вот) в примере: 0. Создание окна в консольном приложении (точнее, TForm) 1. Создание кнопки и обработка её нажатия 2. перетаскивание окна за любое (даже не пристойное =) ) место ![]() ![]() |
|
Создано: 09 февраля 2009 10:43 · Поправил: Mavlyudov · Личное сообщение · #23 |
|
Создано: 09 февраля 2009 11:25 · Личное сообщение · #24 |
|
Создано: 09 февраля 2009 15:49 · Поправил: Halt · Личное сообщение · #25 немного поэкспериментировал над проектом zombiee ![]() да и потом открывается в делфях уже с формы... ![]() |
|
Создано: 09 февраля 2009 15:52 · Личное сообщение · #26 |
|
Создано: 09 февраля 2009 21:45 · Поправил: zombiee · Личное сообщение · #27 |
|
Создано: 10 февраля 2009 01:47 · Личное сообщение · #28 Halt пишет: ха ха ха.. а ларчик просто ) зачет не знал, я извращением таким не занимался никогда спасибо просто лично я не вижу смысла загонять себя в рамки VCL или других классов/объектов когда есть штатные API для таких вещей, например вдруг автор завтра решит что ему VCL не подходит и заюзает KOL или вообще начнет юзать виндовый API для GUI и ему придется все переделывать, а так с SetWindowLong оно в любом исполнении будет работоспособным решением ![]() |
|
Создано: 10 февраля 2009 02:02 · Личное сообщение · #29 |
|
Создано: 10 февраля 2009 04:13 · Поправил: Clerk · Личное сообщение · #30 Halt Перечитывал тут, чуть пацтол не упал ![]() > оконную продцедуру.. которая к томуже раздует твое приложение на +400 кб минимум У тебя какието баги в конпиляторе, это просто не возможно.. У меня оконная процедура заняла 39 байт с учётом пересчёта дельтасмещания, без него и того меньше: Code:
Я взял сервис фиксированной константой(XPSP2), код должен быть в секции доступной для записи, но это я тестил. Реально в вам это не нужно; я исходил из того, что оконная процедура является рекурсией, например SendMessage() сводится к вызову тойже оконной процедуры, посылая только иные коды, чем были приняты до вызова. Проще говоря, чтоб не юзать никакие апи необходимо просто текущие коды изменить, тоесть: Code:
Более ничего не нужно делоть. ![]() |
. 1 . 2 . >> |
![]() |
eXeL@B —› Программирование —› Перетаскивать окно за любую точку. |