На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> ListControl не понятное поведение , Отображает галки через одну
    Доброго всем.
    Есть у меня ListControl я его при выборе объекта обновляю. В объекте находится еще несколько подобъектов которые могут отображаться, а могут и нет. Если в свойствах подобъекта стоит-отображайся то должна быть галка, если нет, галки быть не должно. Вот как я делаю:
    ExpandedWrap disabled
      void MainDialog::UpdateNodesListControls(int selected)
      {
          if (selected < 0)
          {
              return;
          }
          SendMessage(hNodesList, LVM_DELETEALLITEMS, 0, 0);
       
          Layer* layer = gSceneEditor->GetScene()->GetLayerHolder()->GetLayer(selected);
          if (layer)
          {
              int allLayerNodes = layer->GetSize();
              for (int j = allLayerNodes - 1; j >= 0; --j)
              {
                  math::Region* region = layer->GetRegion(j);
                  if (region)
                  {
                      AddItemToListCtrl(hNodesList, region->GetName(), region->GetEditorType());
                      if (region->IsShowEditorInfo())
                      {
                          ListView_SetCheckState(hNodesList, j, true); //при дебаге все время попадаю сюда, а галок все равно нет...
                      }
                      else
                      {
                          ListView_SetCheckState(hNodesList, j, false);
                      }
                  }
              }
          }
      }

    Но почему-то галки ставятся строго через одну, почему так может быть? не подскажите?
    Сообщение отредактировано: staer -
      Какой-то странный цикл. Ты проходишься по всем пунктам с конца в начало, и при этом в цикле добавляешь новые пункты...
        Цитата B.V. @
        Какой-то странный цикл.

        Почему странный?, Вот что я делаю. У меня есть некое хранилище.
        ExpandedWrap disabled
          std::vector<std::string> Items;

        во время работы я напихиваю в него строчки примерно таким образом:
        ExpandedWrap disabled
          for (int i = 0; i < 10; ++i)
          {
           std::ostringstream ostr;
           ostr << "Item_" << i;
           Items.push_back(ostr.str());
          }

        тогда если я буду выводить от 0 до Items.size() будет получаться:
        ExpandedWrap disabled
          Item_9
          Item_8
          ...
          Item_0

        Мне же нужно наоборот, потому вот так.
        А то что в цикле добавляю новые пункты, ну и что с того? Что в прямом проходе что в обратном - какая разница?
          покажи как выглядит AddItemToListCtrl

          Цитата staer @
          Почему странный?

          представь 1ю итерацию
          у тебя добавился один итем ( он есть 1й ), а чек выставляется на 10м....которого как бы еще и нет....

          если хочешь чтоб устанавливалось на последнем, то вместо j поставь -1
            ElcnU, вот:
            ExpandedWrap disabled
              void MainDialog::AddItemToListCtrl(HWND listCtrl, const std::wstring& name, const std::wstring& propery)
              {
                  wchar_t temp[256] = {0};
                  ZeroMemory(&LvItem, sizeof(LvItem));
               
                  LvItem.mask = LVIF_TEXT;
                  LvItem.cchTextMax = 256;
               
                  LvItem.iItem = 0;
                  LvItem.iSubItem = 0;
                  LvItem.pszText = L"";
               
                  SendMessage(listCtrl,LVM_INSERTITEM,0,(LPARAM)&LvItem);
               
                  LvItem.iSubItem = 0;
                  LvItem.pszText = const_cast<wchar_t*>(name.c_str());
                  SendMessage(listCtrl,LVM_SETITEM,0,(LPARAM)&LvItem);
               
                  LvItem.iSubItem = 1;
                  LvItem.pszText = const_cast<wchar_t*>(propery.c_str());
                  SendMessage(listCtrl,LVM_SETITEM,0,(LPARAM)&LvItem);
               
              //  ListView_SetCheckState(listCtrl, 0, true);
              }

            И не совсем понял про первую итерацию. Вот у меня пустой вектор. Я его в него добавил объект - вывел один. Добавил еще один - вывел 2.
            Сообщение отредактировано: staer -
              Цитата staer @
              тогда если я буду выводить от 0 до Items.size() будет получаться:

              Будет получаться с точностью до наоборот

              Цитата staer @
              А то что в цикле добавляю новые пункты, ну и что с того? Что в прямом проходе что в обратном - какая разница?

              Принципиальная разница. Как можно работать с пунктами, которых нет?
                а, вот чего, я вспомнил, при добавлении в лист контрол - объект вставляется не в конец, а в начало списка, потому такой и изврат.
                Цитата B.V. @

                Принципиальная разница. Как можно работать с пунктами, которых нет?

                что значит работать с пунктами которых нет? вот есть у меня вектор объектов, я взял заполнил листконтрнол, после чего начинаю с ним работать. Не понимаю я что-то твоих вопросов, совсем.
                  Цитата staer @
                  что значит работать с пунктами которых нет?

                  Охх.
                  Ты уничтожаешь все пункты строчкой
                  Цитата staer @
                  SendMessage(hNodesList, LVM_DELETEALLITEMS, 0, 0);

                  Затем берешь количество пунктов в своем списке
                  Цитата staer @
                  int allLayerNodes = layer->GetSize();

                  И при j, равном allLayerNodes -1 добавляешь первый пункт
                  Цитата staer @
                  AddItemToListCtrl(hNodesList, region->GetName(), region->GetEditorType());

                  И тут же вызываешь ListView_SetCheckState для несуществующего пункта allLayerNodes -1
                    B.V., ой!
                    сейчас попробую переделать.
                    Окей, сделал вот так:
                    ExpandedWrap disabled
                      void MainDialog::UpdateNodesListControls(int selected)
                      {
                          if (selected < 0)
                          {
                              return;
                          }
                          SendMessage(hNodesList, LVM_DELETEALLITEMS, 0, 0);
                       
                          Layer* layer = gSceneEditor->GetScene()->GetLayerHolder()->GetLayer(selected);
                          if (layer)
                          {
                              int allLayerNodes = layer->GetSize();
                              for (int j = allLayerNodes - 1, i = 0; j >= 0; --j, ++i)
                              {
                                  math::Region* region = layer->GetRegion(j);
                                  if (region)
                                  {
                                      AddItemToListCtrl(hNodesList, region->GetName(), region->GetEditorType());
                                      if (region->IsShowEditorInfo())
                                      {
                                          ListView_SetCheckState(hNodesList, i, true);
                                      }
                                      else
                                      {
                                          ListView_SetCheckState(hNodesList, i, false);
                                      }
                                  }
                              }
                          }
                      }

                    Поменялся порядок не отмеченных галок - если раньше не отмечались вторые, то теперь не отмечаются первые. )))
                    Сообщение отредактировано: staer -
                      Цитата staer @
                      а, вот чего, я вспомнил, при добавлении в лист контрол - объект вставляется не в конец, а в начало списка, потому такой и изврат.

                      вставил итем вначало, он имеет индекс 0, потом ты хочешь его изменить строчкой
                      Цитата staer @
                      ExpandedWrap disabled
                        ListView_SetCheckState(hNodesList, i, true);

                      ты указываешь i, хотя у тебя итем под номером 0, пока не вставился следующий...

                      уловил?

                      ExpandedWrap disabled
                        ListView_SetCheckState(hNodesList, 0, true);

                      на всякий случай
                        ElcnU, есть у меня дружбан, Саня Цукерман. Он темный(не тёмный) парень, много чему научил + не раз подгонял новые карточки(ну пишет для ATI тесты - они его любят), ну умный такой мужик, и вот мы с ним разбираемся что к чему. Он не знает, на форуме никто не знает, и тут находим решение - смотрим - и тут Саня говорит: "Вот к чему стремиться надо 100 решений и все не правильные. Накатить патчи, разобраться в конфигах - и все будет!".
                        Спасибо братан - все окей, помогло!
                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0366 ]   [ 15 queries used ]   [ Generated: 31.05.24, 09:23 GMT ]