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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перетаскивание мышью в ListView 
:(
    Опции темы
rsm
Дата 29.7.2005, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Требуется кусок кода, реализующий перетаскивание мышью одного (а еще лучше - сразу нескольких) строк ListView.

Заранее большое спасибо!
PM MAIL   Вверх
chaos
Дата 29.7.2005, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



из чего куда перетаскивать то?
PM WWW   Вверх
rsm
Дата 29.7.2005, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Просто между собой менять местами.
PM MAIL   Вверх
oper54
Дата 30.7.2005, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Drag and drop - отдельная и длинная тема, просто так вот привести пример не просто, даже если просто менять местами....
Вот вариант, но это не правильно для листбокса, нужно юзать драг и дроп
Переопределяем класс листбокса, добовляем обработчики WM_LBUTTONDOWN и UP
nPrevSel - переменная член класса.
Код

.....
CMyListBox::CMyListBox()
{
    nPrevSel = -1;
}
.....
void CMyListBox::OnLButtonDown(UINT nFlags, CPoint point) 
{
    nPrevSel = GetCurSel();
    CListBox::OnLButtonDown(nFlags, point);
}

void CMyListBox::OnLButtonUp(UINT nFlags, CPoint point) 
{
    int nSel(GetCurSel());
    CString strText;
 
    if(nSel >= 0 && nPrevSel >= 0 && nPrevSel != nSel){
        GetText(nPrevSel, strText);
        DeleteString(nPrevSel);
        InsertString(nSel, strText);        
        nPrevSel = -1;
    }    
    CListBox::OnLButtonUp(nFlags, point);
}
.....

Меняем тип переменной листбокса из CListBox на CMyListBox и все...
PM MAIL   Вверх
oper54
Дата 30.7.2005, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Уточню....
елси требуется на WinApi -
cроки типа "nPrevSel = GetCurSel()", "GetText(nPrevSel, strText)" и т.д. надо будит поменять на сообщения вида ~WM_GETCURSEL, ~WM_GETTEXT(точно не скажу глянь мсдн).


П.С. В WinApi нет стандартного оконного класса ListWiev - это сугубу MFCная примочка....
PM MAIL   Вверх
rsm
Дата 30.7.2005, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



oper54
Твой код работать не будет потому, что во время движения мыши с нажатой левой клавишей выделение не смещается вслед за курсором.
Цитата(oper54 @ 30.7.2005, 14:12)
В WinApi нет стандартного оконного класса ListWiev

А что же я тогда юзаю как ListView? smile

2 All
Вспомнил старую пословицу "хочешь сделать хорошо - сделай это сам", выпил для бодрости чайку и накатал вполне рабочий код:
Код

case WM_NOTIFY:
    if((int) wParam != IDC_LISTVIEW)
        break;
    if(((LPNMHDR)lParam)->code != LVN_BEGINDRAG)
        break;
        
    MSG msg;
    BOOL working = TRUE;
    POINT pt;
    RECT rt;
    unsigned short i, count, oldpos, newpos;
            
    count = SendMessage(hListView, LVM_GETITEMCOUNT, 0, 0);
    oldpos = SendMessage(hListView, LVM_GETNEXTITEM, -1, LVIS_SELECTED);
    while(working)
    {
        GetMessage(&msg, hDlg, 0, 0);
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        if(msg.message != WM_LBUTTONUP)
            continue;
        pt.x = LOWORD(msg.lParam);
        pt.y = HIWORD(msg.lParam);
        MapWindowPoints(hDlg, hListView, &pt, 1);
        for(i = 0; i < count; i++)
        {
            rt.left = LVIR_BOUNDS;
            SendMessage(hListView, LVM_GETITEMRECT, i, (LPARAM) &rt);
            if(PtInRect(&rt, pt))
            {
                newpos = i;
                working = FALSE;
                break;
            }
        }
    }
    MoveItem(oldpos, newpos);
    SelectItem(newpos);
    break;

Если кто интересуется подробнее, см. в аттаче исходники.

Тему можно закрывать.

Это сообщение отредактировал(а) rsm - 30.7.2005, 19:23

Присоединённый файл ( Кол-во скачиваний: 38 )
Присоединённый файл  listviewpro.zip 3,99 Kb
PM MAIL   Вверх
oper54
Дата 18.8.2005, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

Мой код работает, проверял =)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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