C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
TreeVeiew — клик по области Node'а, Как отловить клик по StateImag'у и т.п.?
L@mEr
Отправлено: 07.03.2005, 11:04


Ученик-кочегар

Группа: Участник
Сообщений: 9



Здравствуйте. В хелпе прочитал, что StateImage — это штука для отображения состояния элемента. Сделал логичный вывод, что его можно использовать для того, чтоб бросить туда картинки с чекбоксами и т.п.
Но как мне отловить то, что пользователь кликает не просто по отдельному Node, а по его StateImage?
Ну и, в довеску, то же самое про клик по тексту, если кого не затруднит...
Извините если вопрос покажется слишком ламерским... посмотрите тогда на ник wink.gif
klen
Отправлено: 07.03.2005, 23:30


Машинист паровоза

Группа: Участник
Сообщений: 239



Я тут картинку положил, если тебе так нада https://rxlib.ru/forums/index.php?ac...8120348d177f01e то раскажу ка делать
L@mEr
Отправлено: 08.03.2005, 12:39


Ученик-кочегар

Группа: Участник
Сообщений: 9



Мне так надо smile.gif. Был бы оч признателен.
klen
Отправлено: 08.03.2005, 14:38


Машинист паровоза

Группа: Участник
Сообщений: 239



Предварительно рисуешь иконки всех состояний чекбоксов и заносиш их в ImageList, подкручиваешь его к свойству StateImages дерева и пишеш обработчики

CODE

void __fastcall TStoredPropDlg::TreeViewMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
// фиксируешь место нажатия мышью
FX = X;
}




void __fastcall TStoredPropDlg::TreeViewClick(TObject *Sender)
{
TTreeNode* Node = TreeView -> Selected;
if ( !Node ) return;
if ( !Node -> Parent ) return;

// установка при нажатии на первый чекбокс
if ( FX > 38 && FX < 55 )
{
switch (Node->StateIndex)
{
case 1 :
{
Node->StateIndex = 3;
break;
}
case 2 :
{
Node->StateIndex = 4;
break;
}
case 3 :
{
Node->StateIndex = 1;
UpdateListBox ();
break;
}
case 4 :
{
Node->StateIndex = 2;
break;
}
}
}
// установка при нажатии на второй чекбокс
if ( FX > 54 && FX < 71 )
{
switch (Node->StateIndex)
{
case 1 :
{
Node->StateIndex = 2;
break;
}
case 2 :
{
Node->StateIndex = 1;
break;
}
case 3 :
{
Node->StateIndex = 4;
break;
}
case 4 :
{
Node->StateIndex = 3;
break;
}
}
}
}


Отредактировано klen — 08/03/2005, 14:40
L@mEr
Отправлено: 08.03.2005, 20:39


Ученик-кочегар

Группа: Участник
Сообщений: 9



Сп@СиБ0 smile.gif
L@mEr
Отправлено: 12.03.2005, 17:18


Ученик-кочегар

Группа: Участник
Сообщений: 9



Появилась небольшая проблема: TreeVeiw->Selected может не совпадать с узлом, по которому я в данный момент кликнул (например, селектед узел 0-го уровня, а я в этот момент открываю (Expand'аю) узел 1-го уровня). Тогда координата Х совпадает, и чекбокс реагирует так, будто нажали по нему.
Проблема с отслеживанием координати У состоит в том, что при скроллинге она читется не от 1-го узла, а от верха компонента.
Буду благодарен за любые сумасшедшие идеи, потому как у меня уже мозги оплавились. sad.gif
olegenty
Отправлено: 12.03.2005, 18:54


Ветеран

Группа: Модератор
Сообщений: 2412



а что мешает ориентироваться не на Selected, а на
CODE

TTreeNode* __fastcall GetNodeAt(int X, int Y);
L@mEr
Отправлено: 12.03.2005, 19:14


Ученик-кочегар

Группа: Участник
Сообщений: 9



Мешают, к сожалению, кривые руки...
Или, возможно, элементарное незнакомство с компонентом. Но "Я выучу... Честное слово, выучу" (с) мультик про страну невыученных уроков smile.gif)
Спасибо за ответ smile.gif

Вернуться в Вопросы программирования в C++Builder