| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Выделение в списке |
| Автор: Homer 17.11.2006, 21:13 |
| Как в списке выделить элемент програмно (по приходе сообщение например)? вроде бы должно работать с SetSelectionMark, но ничего не выходит |
| Автор: Samotnik 18.11.2006, 02:21 |
| Попробуй такой вариант: m_list.SetSel( -1,FALSE );//сброс всего выделенного i=-1;//т.к. начинается выделение не с 0 а с -1 m_listBox.SetSel(i,true);//непосредственно выделение m_listBox.GetCurSel()//для того чтобы получить выделенную строку ПЭ.ЭС. Сформулируй вопрос по понятнее!!!!!!!!!!! |
| Автор: Homer 18.11.2006, 10:21 |
| Это по-моему для CListBox, а мне надо для CListCtrl. Вопрос же в том, что мне нужно осуществить поиск в списке из другого диалогого окна, т.е. при нажатии ОК в диалоговом окне выделялась соответствующая (найденная) запись в списке. |
| Автор: Samotnik 19.11.2006, 00:25 |
| Дело в том , что я с ListCtrl мало работаю ,в основном ListBox Может быть так: if (ListCtrl.GetSelectionMark() == -1) ListCtrl.SetSelectionMark(i); Это должно сработать ,только если нет выделенного текста в данный момент. |
| Автор: Earnest 20.11.2006, 10:47 | ||
Вот так:
|
| Автор: sm4sh 22.2.2007, 09:39 | ||||
Спасибо, это работает. Самого давно этот вопрос интересовал. Спрашивается, зачем тогда SetSelectionMark вообще? Но к тебе у меня другой вопрос. Ситуация такая же - осуществляется поиск с диалогового окошка. Но если у меня в поле видимости уже есть выделенный элемент, то появится второй, который помечу уже я. Как этого избежать? К тому же в моей программе можно выделять несколько элементов. Вытекает 2 вопроса: 1. Как узнать индекс начального и конечного текущего видимого элемента? В мсдне видел функцию GetCountPerPage. А дальше как? Искать с нуля первый элемент, который видно и обновлять с него до последнего видимого? Как-то коряво... Еще появилась идея снимать выделение со ВСЕХ ранее помеченных с помощью функций GetFirstSelectedItemPosition и GetNextSelectedItem. Но тоже не идеально... Есть предложения на этот счет? 2. Какие параметры в SetItemState нужно задать, чтобы снять выделение? Заранее благодарен. |
| Автор: chaos 22.2.2007, 10:29 | ||
| что бы не выделялась куча итемов создай свой лист со стилем LVS_SINGLESEL. что бы снять выделения достаточно вроде SetItemState (nItem, 0, LVIS_SELECTED) на счет перебрать все выделеные вот есть даже пример в мсдн:
|
| Автор: sm4sh 22.2.2007, 13:04 |
| chaos, я уже так и сделал. Думал, красИвее есть метод |
| Автор: Earnest 22.2.2007, 18:16 | ||
| В чем вопрос-то? chaos все правильно написал - нет другого способа. Если поставишь LVS_SINGLESEL, то при выборе итема выделение с другого будет автоматически сниматься, а нет - так все под твою ответственность. Я обычно бы еще, для удобства, сделала функцию GetSelection, возвращающую номера всех выделенных элементов, чтобы локализовать код в одном месте:
Выделенные итемы можно удалять, менять им всем состояние, собирать свойства... да мало ли что еще. |