Страница 1 из 3
SysTreeView32 message-s
Добавлено: 28 дек 2007, 10:49
Duncon
Какие сообщения нужно передать чтоб выбрать пункт вот в таком TreeView-е
С учетом что его Хандл я знаю (и Tree и пункта).
Или может кто делал подобное меню объяснит его структуру.. Интересует сама всплывашка и чем является элемент слева от текста itema (собственно на что мышкой кликаем для появления всплывашки)

Re: SysTreeView32 message-s
Добавлено: 28 дек 2007, 11:04
Romeo
Это не просто TreeView, это тривьюшый сабкласс интегрированный в Install Shield, если не ошибаюсь. Так что стандартные методы могут не прокатить. Советую запустить Spy++ , затем сделать выбор с помощью менюшки и посмотреть в логе какие нотификации пришли контролу. Уверен, это поможет.
Re: SysTreeView32 message-s
Добавлено: 28 дек 2007, 11:55
Duncon
Можно эту софтинку, че-то в инете не нашел ничего.. (может название не верное)
Re: SysTreeView32 message-s
Добавлено: 28 дек 2007, 15:40
Romeo
Эта тулза - часть Microsoft Visual C++, начиная с версии 5.0. Скачать можно где угодно. Плохо искал, если не нашёл

Попробуй строку "Spy++ download" в гугле.
Re: SysTreeView32 message-s
Добавлено: 29 дек 2007, 01:10
Eugie
IMHO, на рисунке обычный SysTreeView32 и обычное же всплывающее меню, только оба элемента с привязанными картинками из ImageList. Соответственно, для выбора узла в treeview должен работать TreeView_SelectItem. Всплывание меню по клику на картинку сделано скорее всего в обработчике WM_RBUTTONDOWN вызовом TreeView_HitTest (проверяется "попадание" в картинку).
Re: SysTreeView32 message-s
Добавлено: 29 дек 2007, 10:47
BBB
Duncon писал(а):Можно эту софтинку, че-то в инете не нашел ничего.. (может название не верное)
Могу выложить тут. У меня в архиве получилось 243 KB. Но с работы у нас ограничение на Upload, лишь порядка 40 кб получалось аплоадить. Могу или порезать на части такого размера и выложить, либо на e-mail кинуть.
Re: SysTreeView32 message-s
Добавлено: 01 янв 2008, 23:42
Duncon
Скачал Winspector Spy.. Смогвыделить действие при выделении их собственно 3..
Сначала выделяю с этим вроде нормально
_handle - хандл SysTreeView32
Itemh2 - хандл самого итема
//PostMessage(_handle, TVM_SELECTITEM, TVGN_DROPHILITE, Itemh2);
PostMessage(_handle, TVM_SELECTITEM, TVGN_CARET, Itemh2);
Но следом хз как заслать такое сообщение
Код: Выделить всё
<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>
Тут должен быть смайлик бъющийся об стену...
Re: SysTreeView32 message-s
Добавлено: 02 янв 2008, 10:40
Romeo
А эта твоя тулза содержимое Item не умеет показывать? Там весь смысл в его содержимом, а адрес, который передаётся и который тулза отображает, никакой информации не несёт.
Re: SysTreeView32 message-s
Добавлено: 02 янв 2008, 10:55
Duncon
Умеет выводить текст если это имеется ввиду, у меня сейчас больше вопрос как посталть такое сообщение.. (если он конечно сработает)
Re: SysTreeView32 message-s
Добавлено: 02 янв 2008, 11:29
Romeo
Видишь эту строку:
Вся проблема именно в ней. Дело в том, что когда шлёшь сообщение 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>
Твоя задача проверить достаточно ли этих полей структуры, или тулза что-то не смогла проекстрактить.