Как отловить клики по checkbox'ам в элементе tree-view?
От: Heyyou Россия  
Дата: 16.07.03 07:26
Оценка:
Re: Как отловить клики по checkbox'ам в элементе tree-view?
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 16.07.03 07:49
Оценка:
Здравствуйте, Heyyou, Вы писали:

NM_CLICK не работает?
Re[2]: Как отловить клики по checkbox'ам в элементе tree-vie
От: Heyyou Россия  
Дата: 16.07.03 08:12
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Здравствуйте, Heyyou, Вы писали:


AS>NM_CLICK не работает?


работает, но нужно узнать, когда ткнули не по элементу tree-view вообще, а именно по checkbox'у, а также по какому конкретно checkbox'у, и как изменилось его состояние, то есть поставили галку или убрали.
Re[3]: Как отловить клики по checkbox'ам в элементе tree-vie
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 16.07.03 08:54
Оценка:
Здравствуйте, Heyyou, Вы писали:

[]

Обработчик NM_CLINK
TreeView_GetSelection
TreeView_GetCheckState
Re[4]: Как отловить клики по checkbox'ам в элементе tree-vie
От: Heyyou Россия  
Дата: 16.07.03 09:57
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Здравствуйте, Heyyou, Вы писали:


AS>[]


AS>Обработчик NM_CLINK

AS>
AS>TreeView_GetSelection
AS>TreeView_GetCheckState
AS>


Не совсем то, что надо. Во-первых, обновление состояния checkbox'а происходит НЕ ДО, а ПОСЛЕ уведомления NM_CLICK, то есть в обработчике NM_CLICK я получу текущее состояние checkbox'a, которое сменится (если сменится, почему "если" смотри далее), как только обработчик завершит свои действия. Во-вторых, данным способом нельзя узнать произошел ли клик именно по checkbox'у или же просто по строке, на которой находится checkbox (отсюда то самое "если сменится"), то есть по тексту справа от checkbox'а. А вариант сохранить предыдущее состояние checkbox'а, а потом сравнить с новым состояниеm (то есть, если значение не изменилось, то клик был по строке, если изменилось, то именно по checkbox'у) не подходит как раз потому, что обновление состояния происходит ПОСЛЕ NM_CLICK, а НЕ ДО. Сохранять же текущее состояние, чтобы впоследствии сравнить его с новым не имеет смысла, так как внутри обработчика NM_CLICK я еще не могу знать, произойдет ли изменение состояния (смотри ранее: был ли клик по строке или именно самому checkbox'у).

Ну конечно понятно, что можно сделать так:
из обработчика NM_CLICK добавляем в очередь уведомление:
PostMessage(HWND,MY_NM_MESSAGE,WPARAM,(LPARAM)oldCheckState);

а в обработчике MY_NM_MESSAGE получаем состояние checkbox'a и сравниваем с oldCheckState, только что я сделал это несколько по-другому нежели используя ТreeView_GetSelection и TreeView_GetCheckState.

А есть ли более простое решение?
Re[5]: Как отловить клики по checkbox'ам в элементе tree-vie
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 16.07.03 10:02
Оценка:
Здравствуйте, Heyyou, Вы писали:

[]

H>А есть ли более простое решение?


Попробуй так. Обработчик NM_CLICK
before = GetState();
DefWindowProc();
after = GetState();
Re[5]: Как отловить клики по checkbox'ам в элементе tree-vie
От: VVV Россия  
Дата: 16.07.03 17:47
Оценка: 2 (1)
Здравствуйте, Heyyou, Вы писали:

..
Скорее всего тебе поможет TreeView_HitTest и TVHT_ONITEMSTATEICON. Сам не делал, но есть код для листвью (ListView) для тех же целей — идея там понятна (OWL).
void
TLinesPage::EvNMClickList(void)
{
  TLwHitTestInfo lvhti;
  lvhti.SetPoint(TPoint(::GetMessagePos()));
  ::MapWindowPoints(HWND_DESKTOP, *ListLines, &lvhti.pt, 1);
  int iItemClicked=ListLines->HitTest(lvhti);
  if(lvhti.flags & LVHT_ONITEMSTATEICON)
   {
    int State=ListLines->GetItemState(iItemClicked, LVIS_STATEIMAGEMASK);
    if(State == LVIS_CHECK)
      State=LVIS_NOCHECK;
    else
      State=LVIS_CHECK;
    ListLines->SetItemState(iItemClicked, State, LVIS_STATEIMAGEMASK);
    GetSheet()->PageChanged(*this);
  }
}
Re[6]: Как отловить клики по checkbox'ам в элементе tree-vie
От: Heyyou Россия  
Дата: 17.07.03 08:07
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Здравствуйте, Heyyou, Вы писали:


AS>[]


H>>А есть ли более простое решение?


AS>Попробуй так. Обработчик NM_CLICK

AS>
AS>before = GetState();
AS>DefWindowProc();
AS>after = GetState();
AS>


Неа, не работает, GetState возвращает одно и то же значение. Причем GetSelection, который вроде как надо вызвать до клика тоже не без проблем, она возвращает выделенный элемент, а не тот, по checkbox'у которого кликнули. Дело в том, что при клике по checkbox'у выделение не меняется. Точнее оно меняется, но на доли секунды, то есть заметить можно, но потом возвращается на тот элемент, который был выделен до клика по checkbox'у. В NM_CLICK это изменение не ловится.
Re[6]: Как отловить клики по checkbox'ам в элементе tree-vie
От: Heyyou Россия  
Дата: 18.07.03 01:20
Оценка:
Здравствуйте, VVV, Вы писали:

VVV>Здравствуйте, Heyyou, Вы писали:


VVV>..

VVV>Скорее всего тебе поможет TreeView_HitTest и TVHT_ONITEMSTATEICON. Сам не делал, но есть код для листвью (ListView) для тех же целей — идея там понятна (OWL).

Помогло, спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.