Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Drag & Drop контролов, как бы попроще реализовать 
V
    Опции темы
MoZy
  Дата 7.6.2008, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Привет )

Хочу реализовать Drag & Drop контролов - какие только возможны в WinAPI
Для начала бы неплохо просто перемещение сделать...
Есть 4 вопроса:
оффтоп: можно ли сделать процедурку для нескольких контроллов? smile 
- если да, то для перетаскивания в пределах пэрэнта HTCAPTION (WM_NCHITTEST) подойдет?
- как это вообще в Visual'ах реализовано?
- может проще сделать какой-нить эмулятор вроде статика на момент перетаскивания? 

Ой спасиба!  smile 


Это сообщение отредактировал(а) MoZy - 7.6.2008, 20:17
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
586
Дата 7.6.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Цитата(MoZy @  7.6.2008,  21:10 Найти цитируемый пост)
можно ли сделать процедурку для нескольких контроллов?

делай хук для своего приложения - и нет проблем.
PM   Вверх
MoZy
Дата 7.6.2008, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ням ням.. не оч понял )
Я бы хотел что-то вроде отлова MOUSEDOWN/UP на любом дочернем контролле и штоб этот отлов был в пределах одной процедурки..
Какой мне хук юзать?  =) WH_MOUSE?
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
586
Дата 7.6.2008, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Цитата(MoZy @  7.6.2008,  22:19 Найти цитируемый пост)
Какой мне хук юзать?  =) WH_MOUSE? 

Можно и WH_MOUSE. А окно под курсором определять с помощью WindowFromPoint и делать перемещение с помощью WM_SYSCOMMAND 0xF012. Можно использовать WH_CALLWNDPROC и обрабатывать WM_NCHITTEST.
Цитата(MoZy @  7.6.2008,  22:19 Найти цитируемый пост)
Я бы хотел что-то вроде отлова MOUSEDOWN/UP на любом дочернем контролле и штоб этот отлов был в пределах одной процедурки..

Так и будет.
Код
SetWindowsHookEx(WH_CALLWNDPROC, HookProc, NULL, 0);

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


Бывалый
*


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

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



Круто! Спсибо!
Первый раз юзаю хуки. Прикольно робит. 

В последней стадии застрял:
зашел я значит в WM_NCHITTEST, определил, что окно то которое надо - теперь че делать? 
возврат HTCAPTION никакого эффекта не дает
WM_LBUTTONDOWN че-то не ловит вообще. smile  (ну да, яж от мышки отказался) 

В WM_NCHITTEST шлю SendMessage(hwndDist,WM_SYSCOMMAND,SC_MOVE,MAKEWORD(0,0));
пока сдвинуть сместа не удалось, но теперь перекрестие появляется

Это сообщение отредактировал(а) MoZy - 7.6.2008, 22:56
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
586
Дата 8.6.2008, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Код
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)  // общая оконная процедура
{
    long wp = GetWindowLong(hWnd, GWL_USERDATA);
    switch(uMsg)
    {
    case WM_NCHITTEST: return HTCAPTION;
    }
    return CallWindowProc((WNDPROC)wp, hWnd, uMsg, wParam, lParam);
}

BOOL CALLBACK ChildEnumProc(HWND hWnd, LPARAM lParam)  // перечисляет все дочерние окна и перехватывает их
{
    if(hWnd == Form1->Button1->Handle) return TRUE;  // не перехватывать кнопку, чтобы можно было отключить
    if(lParam) {  // lParam определяет, включить перетаскивание или нет
        SetWindowLong(hWnd, GWL_USERDATA, SetWindowLong(hWnd, GWL_WNDPROC, (long)WndProc));
    } else {
        if(GetWindowLong(hWnd, GWL_WNDPROC) == (long)WndProc)  // определяет, была ли оконная процедура перехвачена
            SetWindowLong(hWnd, GWL_WNDPROC, GetWindowLong(hWnd, GWL_USERDATA));  // восстанавливает оконную процедуру
    }
    return TRUE;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Button1->Tag = !Button1->Tag;
    if(Button1->Tag) {
        EnumChildWindows(Handle, ChildEnumProc, TRUE);
        Button1->Caption = "Stop";
    } else {
        EnumChildWindows(Handle, ChildEnumProc, FALSE);
        Button1->Caption = "Start";
    }
}


Это сообщение отредактировал(а) 586 - 8.6.2008, 06:59
PM   Вверх
MoZy
Дата 8.6.2008, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



586, просто СУПЕР простой метод!!! Огромное спасибо!

Я вот переваял на WinAPI, если кому нада:
Код
 
...
if(MustMove)
{
  //Запоминаем id стандартной процедуры контрола в GWL_USERDATA, устанавливая новую процедуру MoveWndProc как обработчик
   SetWindowLong(hwndLetMove, GWL_USERDATA, SetWindowLong(hwndLetMove, GWL_WNDPROC, (long)MoveWndProc));
}
...
...
if(StopMove)
{
   if(GetWindowLong(hWnd, GWL_WNDPROC) == (long)MoveWndProc)  // определяет, была ли оконная процедура перехвачена
            SetWindowLong(hWnd, GWL_WNDPROC, GetWindowLong(hWnd, GWL_USERDATA));  //если да, то восстанавливаем по запомненому id стандартную процедурку для данного контрола
}
...
LRESULT CALLBACK MoveWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)  // обработка движения
{
    long wp = GetWindowLong(hWnd, GWL_USERDATA);
    switch(uMsg)
    {
    case WM_NCHITTEST: return HTCAPTION;
    }
    return CallWindowProc((WNDPROC)wp, hWnd, uMsg, wParam, lParam);
}

--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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