Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Перетаскивание кнопок


Автор: Coocky 2.4.2004, 21:01
Нужно перетащить кнопку.Если альтернатива отслеживанию MOUSE_MOVE?Может какой-то drop существуетbiggrin.gif

Автор: Stalk 2.4.2004, 21:56
Я обычно ставлю очень маленький таймер(11-23 миллисек) и получаю позицию крысы. Интересная штука: вожу мышей по окну-все ок(есть маусмув), вожу мышей по кнопке в окне-нету маусмува! Кто-нить объяснит мне почему?

Автор: mr.DUDA 2.4.2004, 22:45
Цитата
Нужно перетащить кнопку.Если альтернатива отслеживанию MOUSE_MOVE?Может какой-то drop существует

OnDragEnter и OnDragLeave, если мне память не изменяет... Но рисовать перетаскиваемый объект рядом с курсором мыши всё равно придётся вручную!

Автор: Coocky 4.4.2004, 22:54
Ладно,пошел я в обход.При нажатии ставлю флаг на разрешении перетаскивания кнопки.MOUSE_MOVE тащу.При отпускании флаг ставлю на FALSE.Но не перетаскивается smile.gif
Кто-то подсказал,что это надо обрабатывать в PreTransletMessage .Не знаю,не пробовал...

Автор: Anklav 4.4.2004, 23:35
Если я не ошибаюсь, то можно в обработчике события WM_NCHITTEST параметру Message.Result присвоить значение HTCAPTION

(это если используешь VCL, хотя для MFC почти то же самое)

Автор: mr.DUDA 5.4.2004, 11:28
Coocky, код - в студию ! А при отпускании что происходит ? Надо бы MoveWindow вызвать с новыми координатами...

Anklav, в VCL не разбираюсь, но в MFC не видел никакого HTCAPTION

Автор: Coocky 5.4.2004, 11:45
Цитата
А при отпускании что происходит ?

А при отпускании ставится флаг FALSE на MoveWindow.Что б при перемещении мыши,при НЕ нажатой кнопке,перемещение последней не происходило(фух сказал... biggrin.gif )
Скорей всего проблема ,что нажатие кнопки не отрабатывает сообщение о нажатии кнопки biggrin.gif
Так же,как и PtInRect не работает на Button_e sad.gif
Цитата
Надо бы MoveWindow вызвать с новыми координатами...

Ну как ты мог такое подумать обо мне biggrin.gif
Цитата
Coocky, код - в студию !

Ага вот только права члена клуба получу wink.gif (наверно,в следущей из жизни, когда я стану кошкой... biggrin.gif )

Автор: Coocky 5.4.2004, 12:23
Stalk
Цитата
Интересная штука: вожу мышей по окну-все ок(есть маусмув), вожу мышей по кнопке в окне-нету маусмува! Кто-нить объяснит мне почему?

Вот и у него проблема....
Coocky
Цитата
Скорей всего проблема ,что нажатие кнопки не отрабатывает сообщение о нажатии кнопки 
Так же,как и PtInRect не работает на Button_e 

Наверное я прав sad.gif

Автор: Anklav 5.4.2004, 16:59
Если сделать так:
Код

class CMyWnd: public CWnd
{
        // ...
        afx_msg UINT OnNcHitTest(CPoint Point);
        DECLARE_MESSAGE_MAP();
};

//...
BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
        ON_WM_NCHITTEST()
END_MESSAGE_MAP()
//...
UINT CMyWnd::OnNcHitTest(CPoint Point)
{
        return HTCAPTION;
}
//...

то такое окно можно будет таскать за любую часть.
Аналогично и для и для CButton (нужно только вместо CWnd подставит CButton)

Автор: Nastya 5.4.2004, 17:42
1. Кнопка то же окно. на firststeps.ru была статья таскаем форму за любое место, сдесь прокатит то же
2. Написать свой класс, порожденн от CButton и в нем обрабатывать сообщение, MouseMove, там в одном из парметров можно посмотреть нажата ли при этом левая кнопка мыши, если да таскайте на здоровье
3. Если вся проблема в том, что в окно родителя не приходит сообщение от мыши при заходе на кнопку, можно использовать GetCapture? ReleaseCapture

Надеюсь я правильно поняла о чем речь smile.gif

Автор: mr.DUDA 5.4.2004, 18:17
Coocky, я и забыл предупредить, что Win-сообщения от контролов (маусмув и др.) обрабатывают сами контролы, по причине чего их нужно subclass-ировать (создав производный класс, например от CButton) и обрабатывать сообщения в рамках контрола а не диалога.

Цитата
Ну как ты мог такое подумать обо мне

Сорри biggrin.gif biggrin.gif biggrin.gif ...

Автор: Coocky 7.4.2004, 15:08
Цитата
(создав производный класс, например от CButton) и обрабатывать сообщения в рамках контрола а не диалога.

Да,пардон за вопрос,ну что нужно указать(добавить) в производном классе?Функцию по перетаскиванию?Если можно,приведите пример,можно и схематически smile.gif (Никогда еще не создавал классов,производных от классов МФС,ну кроме CMyDialog:public CDialog biggrin.gif )
Код
class CMyWnd: public CWnd
{
       // ...
       afx_msg UINT OnNcHitTest(CPoint Point);
       DECLARE_MESSAGE_MAP();
};

//...
BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
       ON_WM_NCHITTEST()
END_MESSAGE_MAP()
//...
UINT CMyWnd::OnNcHitTest(CPoint Point)
{
       return HTCAPTION;
}

Первый раз слышу проHTCAPTION;Это видно что-то из WINAPI wink.gif

Автор: Anklav 7.4.2004, 17:58
Цитата

Первый раз слышу проHTCAPTION;Это видно что-то из WINAPI

HTCAPTION - это WinAPI константа
кроме неё есть ещё HTBORDER, HTBOTTOM, HTCLIENT, HTCLOSE и др.
Метод OnNcHitTest() вызывается всякий раз, когда курсор мыши находится над окном. И вызывается он раньше OnMouseMove(), OnMouseDown() и др.
В качестве возвращаемого значения нужно указать в какой области окна произошло событие. Поэтому, если вернуть значение HTCAPTION, то любые действия в любой области окна будут восприниматься как действия над заголовком (Caption) окна.

Автор: Coocky 12.4.2004, 20:00
Да ,но не хочу я с WINAPI работать mad.gif Лучше сделаю через производный класс smile.gif Только подскажите как,я же просил sad.gif smile.gif

Автор: Nastya 13.4.2004, 15:49
В классе от CButton обрабатываешь сообщения мыши, какие взависимости от реализации
LButtonDown, MouseMove.

Вечерком, если не забуду, кину прмерчик

Автор: Coocky 15.4.2004, 21:48
Цитата
Вечерком, если не забуду, кину прмерчик

Ну что же вы,девушка smile.gif Ведь обещали и забыли sad.gif А если бы я на свидание не пришел wink.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)