Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: ListCtrl - выделить элемент  (Прочитано 11941 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Junk
Гость
« : 23-08-2006 12:04 » 

Создал контрол
CListCtrl   m_cListHost;

Но никак не получается выделить в нем какой-нибудь элемент.
Функция m_cListHost.SetSelectionMark(0); все время возвращает -1. Почему нельзя выделить чего-нибудь?
Код:
//Перерисовка элементов ListHost
void CEYEDlg::RedrawCtrlList(void)
{
int i=0;
LP_APK Temp = FirApk;
BOOL state;

m_cListHost.DeleteAllItems();
if (FirApk == NULL)
return;

//CtrlList
while (Temp)
{
state = STATE_OFF;
if (Temp->time <= StateOffTimes)
state = STATE_ON;
CtrlListElement(i,Temp->name,state);
Temp = Temp->next;
i++;
}
m_cListHost.SetSelectionMark(0);
}
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 23-08-2006 12:47 » 

Это работает только если разрешено множественное выделение. У тебя какие стили у ListCtrl?
Для других случаев надо делать по другому ф-ей SetItem, заполнив структуру LVITEM, или  напрямую.
Например, SetItem(0, 0, LVIF_STATE, NULL, 0, LVIS_SELECTED, LVIS_SELECTED, 0);
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Junk
Гость
« Ответ #2 : 23-08-2006 13:03 » 

у меня стоит стиль 'single selection'
При выделении элемента в списке эта функция теперь работает, но при запуске программы, когда не выбран ни один элемент - ничего не происходит, хотя она и возвращает 1

Ну ладно, поставил стиль 'Show_selection always', но функция iPos = m_cListHost.GetSelectionMark(); все время возвращает -1, как еще можно узнать, какой элемент в списке выделен?

Я хочу, чтобы при перерисовке CtrlList, у меня оставался выделенным именно тот элемент, кот. был выделен до перерисовки.
« Последнее редактирование: 19-12-2007 18:31 от Алексей1153++ » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 23-08-2006 13:46 » 

Да неее Junk, ты не понял. У ListCtrl ты можешь установить стиль, чтобы выделять сразу несколько элементов. В этом случае один из выделенных элементов получает как бы статус активного, ну или первого выделенного. Такая "муравьиная дорожка". Именно это и делает SetSelectionMark. Для этого надо разрешить множественный выбор.
Я ща тут глянул в MSDN - я неправильно сказал, я думал что стиль надо включить, оказывается наоборот - надо выключить LVS_SINGLESEL.
Цитата
By default, multiple items may be selected

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Junk
Гость
« Ответ #4 : 23-08-2006 13:50 » 

мне нужно выделять только 1 элемент из списка
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 23-08-2006 15:08 » 

Тогда пользуйся ф-ей SetItem
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Junk
Гость
« Ответ #6 : 02-10-2006 13:44 » 

Как-то мне кажется, что функция
m_cListHost.SetItem(iPos, 0, LVIF_STATE, NULL, 0, LVIS_SELECTED, LVIS_SELECTED, 0);
выделяет элемент в позиции только на 1 раз, при следующей перерисовки списка
iPos = m_cListHost.GetSelectionMark();
возвращает -1
Как сделать так, чтобы элементы в списке "не колбасило"?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 02-10-2006 16:47 » 

Да нет с ф-ей всё в порядке. Вот только чего ты к SelectionMark привязался?

Короче делай раз:

int iPos = m_cListHost.GetNextItem( -1, LVNI_ALL | LVNI_SELECTED);

два... делать уже не надо Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Junk
Гость
« Ответ #8 : 03-10-2006 09:38 » 

круто!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines