Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [WinApi] Связка TreeVew с ListView через lParam, каким образом? 
V
    Опции темы
CynicRus
Дата 22.3.2013, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Приветствую уважаемых форумчан. Потребовалось мне к маленькой консольной тулзе прикрутить маленький GUI. Выбор пал на чистый WinApi, благо я давно собирался это освоить. Так вот, собственно на форме имеются ListView, TreeView и кнопка. По нажатию кнопки заполняется структура. Мне необходимо засунуть в lParam TVITEM индекс, под которым этот элемент был добавлен в дерево. 

Код записи:
Код

  TV_INSERTSTRUCT tvinsert;
                int TreeCount=TreeView_GetCount(GetDlgItem(hwnd,NAMETREE));

                if (TreeCount!=0)
                  {
                      for(int i=0;i<=TreeCount;i++)
                        TreeView_DeleteAllItems(GetDlgItem(hwnd,NAMETREE));
                  }
//
for (int i = 0; i < MyStructItemCount; i++) {
                  current = mystruct[i].item ;
                  if (i==0){
                            tvinsert.hParent=NULL; 

                            tvinsert.hInsertAfter=TVI_ROOT;

                            tvinsert.item.mask=TVIF_TEXT|TVIF_PARAM;
                            tvinsert.item.lParam=i;

                            tvinsert.item.pszText=current->cFriendlyName;
                            tvinsert.item.iImage=0; 
                            tvinsert.item.iSelectedImage=1; 
                            Parent=(HTREEITEM)SendDlgItemMessage(hwnd,NAMETREE,
                            TVM_INSERTITEM,0,(LPARAM)&tvinsert);
                            Root=Parent;
                           Before=Parent;

                            }else {
                                tvinsert.hParent=Root;        
                                  tvinsert.hInsertAfter=TVI_LAST;   
                                  tvinsert.item.pszText=current->cFriendlyName;
                                  tvinsert.item.mask=TVIF_TEXT|TVIF_PARAM;
                                  tvinsert.item.lParam=i;
                                  Parent=(HTREEITEM)SendDlgItemMessage(hwnd,NAMETREE,
                                    TVM_INSERTITEM,0,(LPARAM)&tvinsert);
                            }



в lParam тут пишется I, вроде всё замечательно.

Затем мне необходимо по даблклике на элементе TreeView добавить из структуры в listview. Соответственно, мне надо забрать из lParam индекс. Вот тут и начинаются проблемы. Пытаюсь забрать данные следующим образом:

Код

                TVITEM tvit;
                HTREEITEM hTreeItem = TreeView_GetSelection(hTree);
                tvit.hItem = hTreeItem;
                tvit.mask = TVIF_TEXT|TVIF_PARAM;
                TreeView_GetItem(hTree, &tvit);
                

               int i =tvit.lParam;
               struct mystruct * current = mystruct[i].item;


Так вот в i после этого оказывается всё что угодно, кроме того что я туда записывал. Вот собственно и вопрос - как правильно связать TreeView с ListView?
PM MAIL   Вверх
CynicRus
Дата 22.3.2013, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ну а если я в lParam структуру пакую, то на выходе получаю всё равно балалайку:

Код

tvinsert.item.lParam=reinterpret_cast<int>(current);

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



А вы пишете под Windows CE? Почему я спрашиваю? Потому что TV_INSERTSTRUCT относится к Windows CE. Если вы пишете просто под Windows, то вам нужна TVINSERTSTRUCT. Скорее всего, из-за такого не соответствия и возникают "приколы".


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
CynicRus
Дата 25.3.2013, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Во как...Спасибо, не знал.
PM MAIL   Вверх
CynicRus
Дата 25.3.2013, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Тем не менее - не помогло.

Я уже попробовал структуру, содержащую int для передачи индекса:

Код

struct CurrIndex
{
 int index;
};


Пакую в lParam:

Код

{
                 struct CurrIndex *idx = new CurrIndex;
                  idx->index = i;
                  tvinsert.item.lParam=reinterpret_cast<LPARAM>(idx);
}


Пытаюсь достать:

Код

               CurrIndex* idx = new CurrIndex;
               idx = reinterpret_cast<CurrIndex*>(tvit.lParam);
               int i =idx->index;
               delete(idx);


И в idx всегда одно и тоже значение 0x215.
PM MAIL   Вверх
artsb
Дата 25.3.2013, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Код

int iIndex;
HWND hwndTV;
TVINSERTSTRUCT ins;
TVITEM item;

hwndTV = CreateWindowEx(0,
        WC_TREEVIEW,
        L"Tree View",
        WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES,
        0,
        0,
        100,
        100,
        this->Handle,
        0,
        hInstance,
        NULL);

if(!hwndTV)
{
    return;
}

memset(&ins, 0, sizeof(ins));

ins.hParent = NULL;
ins.hInsertAfter = TVI_ROOT;
ins.item.mask = TVIF_TEXT | TVIF_PARAM;
ins.item.lParam = 55;
ins.item.pszText = L"Item 1";

TreeView_InsertItem(hwndTV, &ins);

memset(&item, 0, sizeof(item));

item.hItem = TreeView_GetFirstVisible(hwndTV);
item.mask = TVIF_TEXT | TVIF_PARAM;

TreeView_GetItem(hwndTV, &item);

iIndex = (int)item.lParam;

DestroyWindow(hwndTV);

iIndex  = 55. Что я не так сделал?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
CynicRus
Дата 25.3.2013, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(artsb @ 25.3.2013,  11:25)
Код

int iIndex;
HWND hwndTV;
TVINSERTSTRUCT ins;
TVITEM item;

hwndTV = CreateWindowEx(0,
        WC_TREEVIEW,
        L"Tree View",
        WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES,
        0,
        0,
        100,
        100,
        this->Handle,
        0,
        hInstance,
        NULL);

if(!hwndTV)
{
    return;
}

memset(&ins, 0, sizeof(ins));

ins.hParent = NULL;
ins.hInsertAfter = TVI_ROOT;
ins.item.mask = TVIF_TEXT | TVIF_PARAM;
ins.item.lParam = 55;
ins.item.pszText = L"Item 1";

TreeView_InsertItem(hwndTV, &ins);

memset(&item, 0, sizeof(item));

item.hItem = TreeView_GetFirstVisible(hwndTV);
item.mask = TVIF_TEXT | TVIF_PARAM;

TreeView_GetItem(hwndTV, &item);

iIndex = (int)item.lParam;

DestroyWindow(hwndTV);

iIndex  = 55. Что я не так сделал?

Вы получаете и отдаёте индекс в рамках одной функции. Попробуйте в одной функции число записать а из другой его прочитать. Мне ведь необходимо в этот парам записывать индекс внутреннего дерева, чтобы затем по клике на TreeView выдать в ListView нужную ветвь.


Хахахахахахаха, странно - но заработало. после 3 дней мозгового штурма! Хахахаха! Спасибо!

Это сообщение отредактировал(а) CynicRus - 25.3.2013, 11:44
PM MAIL   Вверх
HANDLE
Дата 9.4.2013, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не мешало бы проверить что возвращает TreeView_GetItem(), может ошибка.
И в маске item.mask = TVIF_TEXT | TVIF_PARAM; флажок TVIF_TEXT лишний,
потому что для текста нужно еще задать буфер и размер буфера в item.
PM MAIL   Вверх
artsb
Дата 9.4.2013, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



HANDLE, всё верно. Но так как указана длина буфера 0, то этот флаг просто проигнорируется.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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