SysTreeView32 message-s

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Какие сообщения нужно передать чтоб выбрать пункт вот в таком TreeView-е
С учетом что его Хандл я знаю (и Tree и пункта).

Или может кто делал подобное меню объяснит его структуру.. Интересует сама всплывашка и чем является элемент слева от текста itema (собственно на что мышкой кликаем для появления всплывашки)


Изображение
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Это не просто TreeView, это тривьюшый сабкласс интегрированный в Install Shield, если не ошибаюсь. Так что стандартные методы могут не прокатить. Советую запустить Spy++ , затем сделать выбор с помощью менюшки и посмотреть в логе какие нотификации пришли контролу. Уверен, это поможет.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Можно эту софтинку, че-то в инете не нашел ничего.. (может название не верное)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Эта тулза - часть Microsoft Visual C++, начиная с версии 5.0. Скачать можно где угодно. Плохо искал, если не нашёл :) Попробуй строку "Spy++ download" в гугле.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

IMHO, на рисунке обычный SysTreeView32 и обычное же всплывающее меню, только оба элемента с привязанными картинками из ImageList. Соответственно, для выбора узла в treeview должен работать TreeView_SelectItem. Всплывание меню по клику на картинку сделано скорее всего в обработчике WM_RBUTTONDOWN вызовом TreeView_HitTest (проверяется "попадание" в картинку).
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Duncon писал(а):Можно эту софтинку, че-то в инете не нашел ничего.. (может название не верное)
Могу выложить тут. У меня в архиве получилось 243 KB. Но с работы у нас ограничение на Upload, лишь порядка 40 кб получалось аплоадить. Могу или порезать на части такого размера и выложить, либо на e-mail кинуть.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Скачал Winspector Spy.. Смогвыделить действие при выделении их собственно 3..
Сначала выделяю с этим вроде нормально
_handle - хандл SysTreeView32
Itemh2 - хандл самого итема

//PostMessage(_handle, TVM_SELECTITEM, TVGN_DROPHILITE, Itemh2);
PostMessage(_handle, TVM_SELECTITEM, TVGN_CARET, Itemh2);

Но следом хз как заслать такое сообщение :confused:

Код: Выделить всё

  <name>TVM_SETITEMW</name> 
  <sent /> 
  <time>20:15:35.0250</time> 
- <parameters>
  <parameter>Item: 0x00e28728</parameter> 
  <parameter>Mask: TVIF_STATE</parameter> 
  <parameter>State:</parameter> 
  <parameter>State Mask: TVIS_OVERLAYMASK</parameter> 
  </parameters>
  </message>

И еще после для самого выделения по ходу используется

  <name>TVM_SETITEMW</name> 
  <sent /> 
  <time>20:15:46.0796</time> 
- <parameters>
  <parameter>Item: 0x00e500d8</parameter> 
  <parameter>Mask: TVIF_IMAGE | TVIF_SELECTEDIMAGE</parameter> 
  </parameters>
  </message>



И в конце

Код: Выделить всё

  <name>TVM_SELECTITEM</name> 
  <sent /> 
  <time>20:15:46.0796</time> 
- <parameters>
  <parameter>Selected: True</parameter> 
  </parameters>
  </message>
Это я рассматривал несколько иное меню, от представленного на рисунке. Сей час займусь непосредственно тем что на картинке.

Немного позже.

Случай на картинке получает

Код: Выделить всё

  <name>TVM_SETITEMW</name> 
  <sent /> 
  <time>20:52:55.0562</time> 
- <parameters>
  <parameter>Item: 0x019be3e0</parameter> 
  <parameter>Mask: TVIF_STATE</parameter> 
  <parameter>State:</parameter> 
  <parameter>State Mask: TVIS_OVERLAYMASK</parameter> 
  </parameters>
  </message>

 <message>
  <name>TVM_SETITEMW</name> 
  <sent /> 
  <time>20:15:46.0796</time> 
- <parameters>
  <parameter>Item: 0x00e500d8</parameter> 
  <parameter>Mask: TVIF_IMAGE | TVIF_SELECTEDIMAGE</parameter> 
  </parameters>
  </message>


 <message>
  <name>TVM_SETITEMW</name> 
  <sent /> 
  <time>20:52:59.0593</time> 
- <parameters>
  <parameter>Item: 0x01907008</parameter> 
  <parameter>Mask: TVIF_CHILDREN | TVIF_PARAM</parameter> 
  <parameter>lParam: 0x00000000</parameter> 
  </parameters>
  </message>

Тут должен быть смайлик бъющийся об стену...
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

А эта твоя тулза содержимое Item не умеет показывать? Там весь смысл в его содержимом, а адрес, который передаётся и который тулза отображает, никакой информации не несёт.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Умеет выводить текст если это имеется ввиду, у меня сейчас больше вопрос как посталть такое сообщение.. (если он конечно сработает)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Видишь эту строку:

Код: Выделить всё

<parameter>Item: 0x00e28728</parameter> 
Вся проблема именно в ней. Дело в том, что когда шлёшь сообщение TVM_SETITEM в SendMessage должен передаваться поинтер на заполненную структуру TV_ITEM. Твоя тулза отследила этот поинтер, но поинтер, на самом деле, тебе совсем не интересен. Тебе интересен контент структуры, которая расположена по этому поинтеру.

Именно по этой причине я и спросил может ли твоя тулза показать содержимое этой структуры или, на худой конец, просто вывести слепок памяти по этому адресу, и ты уже сам сможешь восстановить значения полей структуры. Сорри, если выразился не достаточно ясно сразу. Думал, ты поймёшь о чём идёт речь с полуслова.

Как только выяснишь содержимое структуры, делаешь следующее:

Код: Выделить всё

TV_ITEM treeItem;
ZeroMemory(&treeItem, sizeof(TV_ITEM));
// Заполняешь структуру вычисленными значениями
SendMessage(hTreeControl, TVM_SETITEMW, 0, &treeItem);
На самом деле я вижу, что некоторые поля структуры тулза всё-таки извлекла и показала:

Код: Выделить всё

<parameter>Mask: TVIF_STATE</parameter> 
<parameter>State:</parameter> 
<parameter>State Mask: TVIS_OVERLAYMASK</parameter> 
Твоя задача проверить достаточно ли этих полей структуры, или тулза что-то не смогла проекстрактить.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить