Поиск:

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 13.4.2006
Где: г.Пенза, Пензенск ой обл.

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



Здрасти.... Пытался найти подобную тему в истории тем.... не нашел... вернее нашел драг ГДИ объектов.... но это нето...

я пытаюсь своими силами склепать нестандартные элементы управления... делаю их из набора объектов CWnd... эти окна прорисовываются на форме и вот такой вопрос... как их сделать так чтобы можно их таскать по форме... просто перемещать... искал событие OnDrag и др в событиях CWnd.. не нашел... но они есть, как я понял, у CView и дочерних от него классов. и можно ли вообще перемещать объекты CWnd? я посмотрел один примерчик с даргом и там создаются объеты на базе CCmdTarget и создаются они в объекте ScrollView... 
PM MAIL ICQ   Вверх
OverBug
Дата 21.11.2006, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 13.4.2006
Где: г.Пенза, Пензенск ой обл.

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



кажись перевелись спецы по drag&drop..... очередной раз искал и не нашел подобных тем...
Уважаемые форумчане!!!!!
ктонибудь что нибудь знает по данной тематике.... 
PM MAIL ICQ   Вверх
Earnest
Дата 21.11.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Есть OLE drag & drop, если желаешь - разбирайся. Смотри классы COleDataSource, COleDropSourse и т.д.

Но мне лично кажется, что для реализации в рамках твоей задачи это слишком громоздко. Я бы сделала ручками: на WM_LBUTTONDOWN определяем таскаемый объект, ставим Capture, меняем курсор ..., на WM_MOUSEMOVE перемещаем, на WM_LBUTTONUP - отпускаем. Всего-то делов.


--------------------
...
PM   Вверх
OverBug
Дата 21.11.2006, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 13.4.2006
Где: г.Пенза, Пензенск ой обл.

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



Sorry.... what is capture and where он должен быть или есть.... smile 
PM MAIL ICQ   Вверх
Earnest
Дата 21.11.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



SetCapture, читай MSDN.


--------------------
...
PM   Вверх
Любитель
Дата 21.11.2006, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Енто означает возможность ловли всех перемещений мыхи вне твоего окна.


--------------------
PM MAIL ICQ Skype   Вверх
OverBug
Дата 22.11.2006, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 13.4.2006
Где: г.Пенза, Пензенск ой обл.

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



вообщем я вчера  smile  smile  smile  smile  smile ... чувствую себя чайником... запутался в трех канаплях... судите сами....

Код

..... OnLButtonDown( .... , CPoint point){
      this->SetCapture();
     CWnd::JnLButtonDown(...);
}

..... OnMouseMove(...., CPoint point){
      if((this->GetCapture()))
    {
            this->MoveWindow(point.x,point.y,17,70);
            this->OnPaint();
    }
......
}

..... OnLButtonUp(....){
     ReleaseCapture();
.....
}



помоему так... писал по памяти... вообщем когда я начинаю таскать объект то он не идет за курсором мыши а находится гдето между координатой 0,0 парента и положением курсора плюс к этому из этой же координаты идет еще один... т.е. их два... видно два... на самом деле ИМХО координата скачет в два места... пытался преоблазовывать point.x в int... и ни как... я вообще правильно все делаю?

Это сообщение отредактировал(а) OverBug - 22.11.2006, 10:21
PM MAIL ICQ   Вверх
Earnest
Дата 22.11.2006, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не if (this->GetCapture()), а if (GetCapture() == this).

Но лучше поставь флаг в OnLButtonDown.
Т.к. Capture может пропасть по независящим от тебя причинам.
По этому поводу нужно еще обрабатывать WM_CAPTURECHANGED - примерно так, как сброс драга.

А с координатами ты уж сам разбирайся - есть, в конце концов, отладчик и отладочная печать ...
Разве что... обрати внимание на то, в какой системе координаты у тебя: дочернее окно хочет получать координаты клиентской области парента (MoveWindow).


--------------------
...
PM   Вверх
OverBug
Дата 22.11.2006, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 13.4.2006
Где: г.Пенза, Пензенск ой обл.

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



я так понял что:
1)т.е. такой флаг: nFlags == MK_LBUTTON
2)при обработке "WM_CAPTURECHANGED - примерно так, как сброс драга", т.е. выполнить ReleaseCapture();

я еще забыл сказать что когда перетаскиваемый объект перекрывает другие объекты такого же класса, то они не перерисовываются.... почему такое? может что-то я упустил?
PM MAIL ICQ   Вверх
Earnest
Дата 23.11.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(OverBug @  23.11.2006,  00:52 Найти цитируемый пост)
1)т.е. такой флаг: nFlags == MK_LBUTTON

Нет... введи управляющий флаг в классе, например m_bInDrag. Который будешь устанавливать в true на LButtonDown, если начат драггинг, т.е. ткнули в объект, который можно таскать. И сбрасывай при завершении драггинга. Capture- это всего лишь механизм, причем не только тобой контролируемый, поэтому не стоит использовать его как признак драггинга.

Еще заметила... Не надо вызывать OnPaint после MoveWindow. Это такая штука... OnPaint должна вызывать сама система, причем тогда, когда ей удобно...
Ты должен вызывать InvalidateRect. Причем у парента и дважды: для старой позиции контрола и для новой. 


--------------------
...
PM   Вверх
OverBug
Дата 27.11.2006, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 13.4.2006
Где: г.Пенза, Пензенск ой обл.

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



вообщем... пока получилось следующее (даю исходник с целью критики... и может быть кому исче понадобится)
Код

void CMyRamka::OnLButtonDown(UINT nFlags, CPoint point)
{
    if(point.y <7)    
        this->SetCapture();
    CWnd::OnLButtonDown(nFlags, point);
}

void CMyRamka::OnMouseMove(UINT nFlags, CPoint point)
{
    RECT rc,prc;

    this->GetWindowRect(&rc);
    this->GetParent()->GetWindowRect(&prc);

    if((this->GetCapture()))
    {
        this->MoveWindow(rc.left - prc.left + point.x - 3, rc.top - prc.top + point.y - 23, 17, 70);

    }

    CWnd::OnMouseMove(nFlags, point);
}
void CMyRamka::OnLButtonUp(UINT nFlags, CPoint point)
{
    ReleaseCapture();
    this->GetParent()->RedrawWindow();
    CWnd::OnLButtonUp(nFlags, point);
}

void CMyRamka::OnCaptureChanged(CWnd *pWnd)
{
    ReleaseCapture();
    CWnd::OnCaptureChanged(pWnd);
}



работа такого кода меня устраивает.... и скоординатами разобрался... когда перетаскиваю окно... то оно само прорисовывается и для этого не надо было вызывать перерисовку самому... smile 
сейчас бьюсь над тем чтобы окно понимало что на него перетаскивают что-то.....

Это сообщение отредактировал(а) OverBug - 27.11.2006, 10:24
PM MAIL ICQ   Вверх
Earnest
Дата 27.11.2006, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



OverBug, ты читаешь через строку: здесь вижу, здесь нет.
Еще раз повторяю: код 
Цитата(OverBug @  27.11.2006,  11:06 Найти цитируемый пост)
if((this->GetCapture()))
 не правильный, т.к. GetCapture возвращает окно, которое захватило мышь. Ведь захватить мышь может не только твое окно.
Если уж проверяешь Capture то сравнивай с this.
И не используй Capture как признак драггинга, неужели флажок трудно ввести?
Твой код работает только в исключительно благоприятных ситуациях. Попробуй хотя бы, не закончив таскать объект, переключится в другое приложение и что-нибуль там поделать.
Кроме того, драг&дроп удобнее реализовывать на уровне парента. Примерно так:

Код

void CMyDialog::StartDragging (CPoint pt)
{
    m_pDragWnd = FindDrag(pt);   // эта функция ищет контрол по pt и проверяет, можно ли его таскать
}

// ok показывает как завершился драг - с подтверждением или отказом, скажем по потере capture
void CMyDialog::StopDragging (bool bOk)
{
    m_pDragWnd = 0;
}

void CMyDialog::OnLButtonDown(...)
{
   StartDragging(pt);  
}

void CMyDialog::OnMouseMove(...)
{
   if (m_pDragWnd)
  {
     // рисуем таскаемый объект
  }
}

void CMyDialog::OnLButtonUp(...)
{
   StopDrag(true);
}

void CMyDialog::OnCaptureChanged(...)
{
   StopDrag(false);
}

// можно еще по ESC завершать перетаскивание 
void CMyDialog::OnRButtonDown(...)
{
   StopDrag(false);
}



--------------------
...
PM   Вверх
OverBug
Дата 27.11.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 13.4.2006
Где: г.Пенза, Пензенск ой обл.

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



а как задать области где перетаскиваемый объект можно бросать? тут без оли можно обойтись или нет?

Это сообщение отредактировал(а) OverBug - 27.11.2006, 16:18
PM MAIL ICQ   Вверх
Earnest
Дата 27.11.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Области окна, в котором осуществляется драг? Элементарно. На MouseMove проверяй, где мышь, и, если вне области дозволенного дропа, показывай курсор-дулю (ну такой стандартный перечеркнутый круг) вместо перерисовки контрола. А при нормальной позиции - не забудь его спрятать. На дроп придется проверить то же самое, или флаг веди.


--------------------
...
PM   Вверх
OverBug
Дата 27.11.2006, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 13.4.2006
Где: г.Пенза, Пензенск ой обл.

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



т.е.,как я понял, в условии драггинга появятся два условия: одно - если область дозволенная, другое - все остальные случаи.... и проверять на дозволенность позиции можно сразу по нескольким областям....

а в случае между окнами, хотябы двух копий одного и тогоже приложения.... или его тулвиндовов???
PM MAIL ICQ   Вверх
Earnest
Дата 27.11.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Тогда сложнее. Из OnMouseMove нужно опрашивать окно под курсором, не желает ли оно принять объект. Для этого нужно ввести свое сообщение, в wParam, lParam можно передать дополнительные параметры, а в случае отказа должен возвращаться 0, чтобы окна, не обрабатывающие твое сообщение, адекватно реагировали. Но, как ты понимаешь, совсем чужое окно твое сообщение не примет.


--------------------
...
PM   Вверх
OverBug
Дата 29.11.2006, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 13.4.2006
Где: г.Пенза, Пензенск ой обл.

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



интересно... но ведь под курсором то окно которое я тащу.... перетаскиваю.... как получить то которое ниже?
и если я буду проверять на области в которых дозволено бросать объект.... надо ведь еще и массив этих координат не только хранить, но и поддерживать в актуальном состоянии. а как это лучше сделать?
PM MAIL ICQ   Вверх
Earnest
Дата 29.11.2006, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Нет, если ты спросишь WindowFromPoint, то тебе вернут окно верхнего уровня (не Child). Если хочешь получить child, нужно опрашивать ChildWindowFromPoint.

Каждое окно, которое может принять объект, пусть и хранит само свои области.


--------------------
...
PM   Вверх
OverBug
Дата 29.11.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 13.4.2006
Где: г.Пенза, Пензенск ой обл.

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



понятненько.... спасибо.... как будет готова полная версия выложу ее на всеобщее обозрение.... smile 
PM MAIL ICQ   Вверх
CityAC
Дата 15.3.2007, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Тоже столкнулся с такой задачей.

Прочитал эту ветку.
Никак не могу понять.
Если нужно таскать кнопку, то она же не реагирует на события мыши прописанные для диалога.
Код

//При нажатии на кнопку мы никогда в этот обработчик не попадем
// а попадем в обработчик события кнопки
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    
    SetCapture()
    m_bDrag = true;
    // TODO: Add your message handler code here and/or call default

    CDialog::OnLButtonDown(nFlags, point);
    
}

Так как же таскать кнопки.
Что для каждой кнопки нужно писать свой обработчик, а если у меня из 32 шт?

--------------------
Вижу цель, не вижу припятствий.  
PM MAIL ICQ   Вверх
Earnest
Дата 15.3.2007, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Лови в PreTranslateMessage диалога.


--------------------
...
PM   Вверх
CityAC
Дата 15.3.2007, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

BOOL CregionDlg::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message==    WM_LBUTTONDOWN)
    {
        pMsg->lParam;//?????????????????
        
    }        

    // TODO: Add your specialized code here and/or call the base class

    return CDialog::PreTranslateMessage(pMsg);
}


Как из pMsg извлечь информацию кто послал сообщение, т.е. какая кнопка была нажата?
--------------------
Вижу цель, не вижу припятствий.  
PM MAIL ICQ   Вверх
CityAC
Дата 15.3.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я сделал так 
Код

BOOL CregionDlg::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message==    WM_LBUTTONDOWN)
    {
        CButton* pWnd = (CButton*)GetDlgItem(IDOK);
        CRect rect;
        pMsg->pt;
        pWnd->GetClientRect(rect);
        pWnd->ClientToScreen(rect);
        if(PtInRect(rect, pMsg->pt))
            MessageBox("You pressed OK");
        
    }    

    // TODO: Add your specialized code here and/or call the base class

    return CDialog::PreTranslateMessage(pMsg);
}

но получается нужно этот код прописывать для всех кнопок, которые планируешь таскать.
Наверно все таки нужно вытягивать инфу из pMsg/
Подскажите как smile 

--------------------
Вижу цель, не вижу припятствий.  
PM MAIL ICQ   Вверх
Earnest
Дата 15.3.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В сообщении нет такой информации.
Но ты элементарно можешь найти, над каким контролом в настоящий момент находится мышь: ChildWindowFromPoint (что-то в этом роде).


--------------------
...
PM   Вверх
CityAC
Дата 15.3.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



да спасибо.
Я вычитал эту функцию в вашем же посте в этой ветке.
Но что значит Child  в данном случае. кнопка ОК  - это child?
Код

BOOL CregionDlg::PreTranslateMessage(MSG* pMsg)
{
.....
         // после выполнении след кода pWnd  равно 0х0000000
    CWnd* pWnd = ChildWindowFromPoint(pMsg->pt);
        //а если сделать так то вроде работает
         CWnd* pWnd = WindowFromPoint(pMsg->pt);
       
        
}


--------------------
Вижу цель, не вижу припятствий.  
PM MAIL ICQ   Вверх
zkv
Дата 15.3.2007, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



Цитата(CityAC @  15.3.2007,  16:47 Найти цитируемый пост)
Но что значит Child  в данном случае. кнопка ОК  - это child?

кнопка Ок - это child-окно своего диалога
также child-окнами диалога являются все остальные контролы этого диалога
PM MAIL   Вверх
CityAC
Дата 16.3.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

да спасибо.
Я вычитал эту функцию в вашем же посте в этой ветке.
Но что значит Child  в данном случае. кнопка ОК  - это child?код C++
Код



  BOOL CregionDlg::PreTranslateMessage(MSG* pMsg)
{
.....
         // после выполнении след кода pWnd  равно 0х0000000
    CWnd* pWnd = ChildWindowFromPoint(pMsg->pt);
        //а если сделать так то вроде работает
         CWnd* pWnd = WindowFromPoint(pMsg->pt);
       
        
}



Разобрался, нужно было pMsg->pt привести к клиетским координатам
--------------------
Вижу цель, не вижу припятствий.  
PM MAIL ICQ   Вверх
13dreams
Дата 4.7.2010, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Простите, как изменить координаты самой кнопки использую вышеизложенный код? (как её перерисовать)
PM MAIL   Вверх
Earnest
Дата 5.7.2010, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Перечитывать древний топик сильно влом, поэтому отвечу "наугад" - MoveWindow?


--------------------
...
PM   Вверх
13dreams
Дата 5.7.2010, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Задача состоит в том, чтобы пользователь мог перетащить созданную кнопку по окну

я хотел спросить где и как реализуется само изменение её координат
PM MAIL   Вверх
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.0849 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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