Поиск:

Ответ в темуСоздание новой темы Создание опроса
> drag и drop елементов управления, как таскать объекты CWnd по форме..... 
:(
    Опции темы
13dreams
Дата 5.7.2010, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 1.7.2010

Репутация: нет
Всего: нет



В принципе я разобрался. Использую вышеприведённый код - в (PreTranslateMessage) для того чтобы ловить на какой кнопке был совершён клик пользуюсь сообщением WM_LBUTTONDOWN. Устанавливаю там флаг

и дальше в WM_LBUTTONUP двигаю кнопку в координаты где находился курсор в данный момент. Но не получается преобразовать координаты курсора

Код

BOOL CTest2008Dlg::PreTranslateMessage(MSG* pMsg)
{    
    bool fflag=false;
    if (pMsg->message==    WM_LBUTTONDOWN)
    {
        CButton* pWnd2 = (CButton*)GetDlgItem(IDC_BUTTON2);
        CRect rect2;
        pMsg->pt;
        pWnd2->GetClientRect(rect2);
        pWnd2->ClientToScreen(rect2);
        if(PtInRect(rect2, pMsg->pt))
        {fflag=true;
        }
        
    }    
    if (pMsg->message==    WM_LBUTTONUP)
    {    CPoint tpoint;
        GetCursorPos(&tpoint);
        ClientToScreen(tpoint);
        if (fflag==true){
m_Btn2.MoveWindow(tpoint.x,tpoint.y,80,30,1);
fflag=false;
        }
    }

    // TODO: Add your specialized code here and/or call the base class
    return CDialog::PreTranslateMessage(pMsg);
}


Ошибка - невозможно преобразовать из CPoint в LPPOINT

как получить координаты курсора (или преобразовать их)
PM MAIL   Вверх
Albor
Дата 5.7.2010, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(13dreams @  5.7.2010,  15:48 Найти цитируемый пост)
Ошибка - невозможно преобразовать из CPoint в LPPOINT

LPPOINT это указатель, а не объект CPoint. Поэтому нужно делать операцию взятия адреса как в GetCursorPos(&tpoint);
PM MAIL ICQ   Вверх
13dreams
Дата 5.7.2010, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 1.7.2010

Репутация: нет
Всего: нет



Спасибо большое! Всё получилось но один момент : пришлось вместо строки 
Код

m_Btn2.MoveWindow(tpoint.x,tpoint.y,80,30,1);
 написать

Код

m_Btn2.MoveWindow(tpoint.x-360,tpoint.y-200,80,30,1);

т.к. объект двигался на небольшом расстоянии от курсора

Чего так происходит? Я так понимаю нужно что-то к чему-то привести?


ps и если кто-то захочет использовать код - я определил флаг не в том месте. Его нужно определить где-то повыше
PM MAIL   Вверх
13dreams
Дата 9.7.2010, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 1.7.2010

Репутация: нет
Всего: нет



Пожалуйста, помогите довести до конца пример

решил использовать приведённую выше идею чтобы сократить код

Код

CWnd* pWnd;


Код

BOOL CTTestDlg::PreTranslateMessage(MSG* pMsg)
{    
    if (pMsg->message==    WM_LBUTTONDOWN)
    {
        
 pWnd = ChildWindowFromPoint(pMsg->pt);

    }    
//-------------------------------------------------------------------------------------
    if (pMsg->message==    WM_LBUTTONUP)
    {    
        CPoint tpoint;
        tpoint.x=0;
        tpoint.y=0;
        GetCursorPos(&tpoint);
        ClientToScreen(&tpoint);
        pWnd->MoveWindow(tpoint.x,tpoint.y,60,60,1);
    }
    // TODO: Add your specialized code here and/or call the base class
    return CDialog::PreTranslateMessage(pMsg);
}



Работает некорректно. 
1. Выше написано что нужно (pMsg->pt) привести к клиентским координатам. Как это сделать?
2. Как выполнить проверку на то, что не получен указатель на главное окно? Чтоб окно не реагировало на код изменения положения

Заранее спасибо!
PM MAIL   Вверх
Ghost99
Дата 18.12.2011, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 6.6.2009

Репутация: нет
Всего: нет



Я таки дико извиняюсь,что поднимаю мертвую тему но...
Можно использовать сообщения в  не клиентскую область окна:

Наследник от CButton:
Код

void CDragButton::OnLButtonDown(UINT nFlags, CPoint point)
{
    SendMessage(WM_NCLBUTTONDOWN, HTCAPTION,NULL);
    CButton::OnLButtonDown(nFlags, point);

}

тут есть единственная промблемма - как получить сообщение, что левая кнопка отпущена и передать это контроллу?
Перемещение работает, но конторол после перемещения ведет себя не адекватно:
сообщение WM_LBUTTONUP не ловит - при наведении на него отображается как нажатый.
Может быть хук поставить?


Это сообщение отредактировал(а) Ghost99 - 18.12.2011, 02:55
PM MAIL   Вверх
Earnest
Дата 18.12.2011, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Не хук, а капчу (SetCapture). Это обычный прием при обработке drag & drop. Тогда все мышиные события будут приходить твоей кнопке, независимо от позиции мыши - пока не отпустишь.


--------------------
...
PM   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.