Поиск:

Ответ в темуСоздание новой темы Создание опроса
> List Control, клик на ячейке 
V
    Опции темы
Aline
Дата 5.8.2009, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем привет!

Есть List Control в виде таблицы (Report). В нём 4 колонки. В первой колонке необходимо реализовать отработку клика левой кнопкой мыши, как это сделать?
Т.е. на ней надо кликнуть мышкой и в ней должен поменяться текст. Вернее я не могу понять какой Event выбрать, добавила все где Click или Change, но в отладчике на тчку останова внутри процедур не попадаю. Студия 7-я от 2002г.

Нашла вот такой пример:
Код

void CObjectFilterWnd::OnFltItemChanged (NMHDR* pNMHDR,LRESULT* pResult)
{
   LPNMLISTVIEW pNMLV = (LPNMLISTVIEW)pNMHDR;

   if ((pNMLV->iItem == -1) || !(pNMLV->uChanged & LVIF_STATE))
      return;
   if (!((pNMLV->uNewState ^ pNMLV->uOldState) & LVIS_SELECTED))
      return;

   // ...

   // m_wndFilter - это переменная диалога, которая связывается с контролом через DDX_Control
   m_wndFilter.SetItemText(pNMLV->iItem,0,_T("!!!"));
}



но я не могу найти в свойствах, вернее в Event событие OnFltItemChanged . Как сделать?
PM MAIL   Вверх
Earnest
Дата 5.8.2009, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Лови уведомление NM_CLICK:    
ON_NOTIFY (IDC_LIST, NM_CLICK,  OnClick). 
В качестве pNMHDR приходит информация о кликнутом итеме (см. MSDN), но можно и просто HitTest вызвать.



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


Опытный
**


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

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



Earnest, спасибо, сейчас попробую
PM MAIL   Вверх
Aline
Дата 6.8.2009, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пробую - не получается smile. Можно подробнее о том, как добавить "уведомление NM_CLICK:    
ON_NOTIFY (IDC_LIST, NM_CLICK,  OnClick)."
У List Control я не нахожу OnClik, при добавлении  Event на NM_Click формируется процедура:

OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult)

но на точке останова там опять не останавливается

PM MAIL   Вверх
Aline
Дата 6.8.2009, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сделала вот так:

Код

BOOL CCompressorDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
    LV_DISPINFO* lv_dispInfo = (LV_DISPINFO*)lParam;
    CString s;

    if (lv_dispInfo->hdr.code == NM_CLICK){
        if (lv_dispInfo->item.iItem != -1){
            s = m_LstFile.GetItemText(lv_dispInfo->item.iItem,0);
            if (s == "v"){
              s = "";
            }
            else s = "v";

            m_LstFile.SetItemText(lv_dispInfo->item.iItem, 0,s);
        }
    }

    return CDialog::OnNotify(wParam, lParam, pResult);
}


Теперь на точку останова попадает, всё замечательно меняется, но только в первой строке smile. Почему то lv_dispInfo->item.iItem всегда равен 0. В чем дело? Товарище помогите пожайлуста, очень-очень надо
PM MAIL   Вверх
Aline
Дата 6.8.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Код

BOOL CCompressorDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
    LV_DISPINFO* lv_dispInfo = (LV_DISPINFO*)lParam;
    CString s;

    if (lv_dispInfo->hdr.code == NM_CLICK){
           DWORD dwPos = GetMessagePos();
           CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
   
           m_LstFile.ScreenToClient(&point);
   
           LVHITTESTINFO lvinfo;
           lvinfo.pt = point;
           lvinfo.flags = LVHT_ABOVE;
     
           int nItem = m_LstFile.SubItemHitTest(&lvinfo);

        if (nItem != -1){
            s = m_LstFile.GetItemText(nItem,0);
            if (s == "v"){
              s = "";
            }
            else s = "v";

            m_LstFile.SetItemText(nItem, 0,s);
            if (m_delAll){ m_ClearAll.SetCheck(0); m_delAll = false;}
            if (m_OpenAll) { m_ChAll.SetCheck(0); m_OpenAll = false;}
        }
    }

    return  CDialog::OnNotify(wParam,lParam,pResult);
}

PM MAIL   Вверх
Earnest
Дата 7.8.2009, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Aline, не надо увлекаться визардами. Все уведомления добавляются одинаково, ровно как я написала: метод
void OnTramPamPam(NMHDR* pNMHDR,LRESULT* pResult) + в карту сообщений ON_NOTIFY (IDC_LIST, NM_TRAMPAMPAM,  OnTramPamPam). Имена функции, естественно, произвольные, главное - сигнатуру соблюдать. Так как ты сделала, тоже можно, но несколько громоздко. Подумай, что будет с кодом, если нужно обрабатывать несколько уведомлений.



--------------------
...
PM   Вверх
Aline
Дата 7.8.2009, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Earnest, я визардами не увлекалась. Я не знаю, что это было, но в 2005 студии я спокойно добавила обработчик для NM_CLICK и он  ловил клик мыши на ListControl, а вот в 2002 студии это почему то не работало. Пришлось идти этим путем. Вы мне можете объяснить почему работает в одном месте и не работает в другом? Хотя действия одни и те же....
PM MAIL   Вверх
Earnest
Дата 7.8.2009, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Значет, не одни. Ты код сравнивала? Вот если код один и тот же, тогда вопрос. Впрочем, 2002 студию я пропустила (по слухам, она весьма глючная), а на 2003 все нормально.


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


Опытный
**


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

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



Сравнивала я всё. 2003-й нету, а проект был сделан в 2002, поэтому и дорабатывать надо было в ней. И не я одна не могла понять почему не работает. Так что это вопрос.
PM MAIL   Вверх
Earnest
Дата 7.8.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Зачем работать в глючной студии, когда есть более стабильные варианты. Из мазохизма, что ли.
Но если очень хочется, то можно и разобраться.  Скажем, код сгенерирован (написан) один и тот же и он правильный. Но в 2002 в обработчик не приходит управление. Так? Тогда ищем в MFC метод OnNotify или пишем свой (просто вызывая стандартный - так проще для отладки) и ковыряемся там - чего это уведомление не диспетчеризируется? Может, в MFC 2002 глюки? Ну и т.д.
Хотя я бы просто взяла нормальную среду.


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


Опытный
**


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

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



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


Эксперт
****


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

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



Да нет проблем, ты спрашиваешь -  я отвечаю. Ты написала "Так что это вопрос". Я поняла так, что нужно разбираться. Нет, и слава богу.


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


 




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


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

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