![]() |
|
|
![]()
|
|
| OverBug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 13.4.2006 Где: г.Пенза, Пензенск ой обл. Репутация: нет Всего: 1 |
Здрасти.... Пытался найти подобную тему в истории тем.... не нашел... вернее нашел драг ГДИ объектов.... но это нето...
я пытаюсь своими силами склепать нестандартные элементы управления... делаю их из набора объектов CWnd... эти окна прорисовываются на форме и вот такой вопрос... как их сделать так чтобы можно их таскать по форме... просто перемещать... искал событие OnDrag и др в событиях CWnd.. не нашел... но они есть, как я понял, у CView и дочерних от него классов. и можно ли вообще перемещать объекты CWnd? я посмотрел один примерчик с даргом и там создаются объеты на базе CCmdTarget и создаются они в объекте ScrollView... |
|||
|
||||
| OverBug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 13.4.2006 Где: г.Пенза, Пензенск ой обл. Репутация: нет Всего: 1 |
кажись перевелись спецы по drag&drop..... очередной раз искал и не нашел подобных тем...
Уважаемые форумчане!!!!! ктонибудь что нибудь знает по данной тематике.... |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Есть OLE drag & drop, если желаешь - разбирайся. Смотри классы COleDataSource, COleDropSourse и т.д.
Но мне лично кажется, что для реализации в рамках твоей задачи это слишком громоздко. Я бы сделала ручками: на WM_LBUTTONDOWN определяем таскаемый объект, ставим Capture, меняем курсор ..., на WM_MOUSEMOVE перемещаем, на WM_LBUTTONUP - отпускаем. Всего-то делов. -------------------- ... |
|||
|
||||
| OverBug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 13.4.2006 Где: г.Пенза, Пензенск ой обл. Репутация: нет Всего: 1 |
Sorry.... what is capture and where он должен быть или есть....
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
SetCapture, читай MSDN.
-------------------- ... |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 7 Всего: 92 |
Енто означает возможность ловли всех перемещений мыхи вне твоего окна.
|
|||
|
||||
| OverBug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 13.4.2006 Где: г.Пенза, Пензенск ой обл. Репутация: нет Всего: 1 |
вообщем я вчера
помоему так... писал по памяти... вообщем когда я начинаю таскать объект то он не идет за курсором мыши а находится гдето между координатой 0,0 парента и положением курсора плюс к этому из этой же координаты идет еще один... т.е. их два... видно два... на самом деле ИМХО координата скачет в два места... пытался преоблазовывать point.x в int... и ни как... я вообще правильно все делаю? Это сообщение отредактировал(а) OverBug - 22.11.2006, 10:21 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Не if (this->GetCapture()), а if (GetCapture() == this).
Но лучше поставь флаг в OnLButtonDown. Т.к. Capture может пропасть по независящим от тебя причинам. По этому поводу нужно еще обрабатывать WM_CAPTURECHANGED - примерно так, как сброс драга. А с координатами ты уж сам разбирайся - есть, в конце концов, отладчик и отладочная печать ... Разве что... обрати внимание на то, в какой системе координаты у тебя: дочернее окно хочет получать координаты клиентской области парента (MoveWindow). -------------------- ... |
|||
|
||||
| OverBug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 13.4.2006 Где: г.Пенза, Пензенск ой обл. Репутация: нет Всего: 1 |
я так понял что:
1)т.е. такой флаг: nFlags == MK_LBUTTON 2)при обработке "WM_CAPTURECHANGED - примерно так, как сброс драга", т.е. выполнить ReleaseCapture(); я еще забыл сказать что когда перетаскиваемый объект перекрывает другие объекты такого же класса, то они не перерисовываются.... почему такое? может что-то я упустил? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Нет... введи управляющий флаг в классе, например m_bInDrag. Который будешь устанавливать в true на LButtonDown, если начат драггинг, т.е. ткнули в объект, который можно таскать. И сбрасывай при завершении драггинга. Capture- это всего лишь механизм, причем не только тобой контролируемый, поэтому не стоит использовать его как признак драггинга. Еще заметила... Не надо вызывать OnPaint после MoveWindow. Это такая штука... OnPaint должна вызывать сама система, причем тогда, когда ей удобно... Ты должен вызывать InvalidateRect. Причем у парента и дважды: для старой позиции контрола и для новой. -------------------- ... |
|||
|
||||
| OverBug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 13.4.2006 Где: г.Пенза, Пензенск ой обл. Репутация: нет Всего: 1 |
вообщем... пока получилось следующее (даю исходник с целью критики... и может быть кому исче понадобится)
работа такого кода меня устраивает.... и скоординатами разобрался... когда перетаскиваю окно... то оно само прорисовывается и для этого не надо было вызывать перерисовку самому... сейчас бьюсь над тем чтобы окно понимало что на него перетаскивают что-то..... Это сообщение отредактировал(а) OverBug - 27.11.2006, 10:24 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
OverBug, ты читаешь через строку: здесь вижу, здесь нет.
Еще раз повторяю: код не правильный, т.к. GetCapture возвращает окно, которое захватило мышь. Ведь захватить мышь может не только твое окно. Если уж проверяешь Capture то сравнивай с this. И не используй Capture как признак драггинга, неужели флажок трудно ввести? Твой код работает только в исключительно благоприятных ситуациях. Попробуй хотя бы, не закончив таскать объект, переключится в другое приложение и что-нибуль там поделать. Кроме того, драг&дроп удобнее реализовывать на уровне парента. Примерно так:
-------------------- ... |
|||
|
||||
| OverBug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 13.4.2006 Где: г.Пенза, Пензенск ой обл. Репутация: нет Всего: 1 |
а как задать области где перетаскиваемый объект можно бросать? тут без оли можно обойтись или нет?
Это сообщение отредактировал(а) OverBug - 27.11.2006, 16:18 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Области окна, в котором осуществляется драг? Элементарно. На MouseMove проверяй, где мышь, и, если вне области дозволенного дропа, показывай курсор-дулю (ну такой стандартный перечеркнутый круг) вместо перерисовки контрола. А при нормальной позиции - не забудь его спрятать. На дроп придется проверить то же самое, или флаг веди.
-------------------- ... |
|||
|
||||
| OverBug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 13.4.2006 Где: г.Пенза, Пензенск ой обл. Репутация: нет Всего: 1 |
т.е.,как я понял, в условии драггинга появятся два условия: одно - если область дозволенная, другое - все остальные случаи.... и проверять на дозволенность позиции можно сразу по нескольким областям....
а в случае между окнами, хотябы двух копий одного и тогоже приложения.... или его тулвиндовов??? |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |