Пара вопросов насчет CListCtrl
От: Korrh  
Дата: 16.05.03 12:58
Оценка:
Вопрос 1 — как в СListCtrl (даже ClistCtrlEx) сделать так, чтобы выбирался не только крайний левый элемент, а вся строка?
(на codeproject есть, но там так закручено......=(( )
Вопрос 2 — получение значения выбранного элемента:

у меня под ХР прекрасно работает int zxcv = List.GetHotItem();
m_Result = List.GetItemText(zxcv,0);

но по неизвестной мне причине ни на 1 компе кроме моего это не идет (видимо все дружно отключили HOVER) хотя по MSDN должно пахать на любом PC с IE 3.x и выше.

Приходится использовать нарытое здесь в архивах:

POSITION pos = List.GetFirstSelectedItemPosition();
int zxcv = List.GetNextSelectedItem(pos);
m_Result = List.GetItemText(zxcv,0);

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

Может есть какой способ хитрый как-то с программой включать опцию Ховер и соотв. выключать при завершении?
Re: Пара вопросов насчет CListCtrl
От: IvEv  
Дата: 16.05.03 13:08
Оценка: 2 (1)
Здравствуйте, Korrh, Вы писали:

K>Вопрос 1 — как в СListCtrl (даже ClistCtrlEx) сделать так, чтобы выбирался не только крайний левый элемент, а вся строка?

K>(на codeproject есть, но там так закручено......=(( )

    myListCtrl.SetExtendedStyle(myListCtrl.GetExtendedStyle() | LVS_EX_FULLROWSELECT);
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
Re: Пара вопросов насчет CListCtrl
От: kmn Украина  
Дата: 17.05.03 12:31
Оценка: 3 (1)
Здравствуйте, Korrh, Вы писали:

K>Вопрос 2 — получение значения выбранного элемента:


//single/single select
int iCurSel = List.GetNextItem(-1, LVNI_FOCUSED|LVNI_SELECTED);


// multy select

POSITION pos = pList->GetFirstSelectedItemPosition();
if (pos == NULL)
   TRACE0("No items were selected!\n");
else
{
   while (pos)
   {
      int nItem = pList->GetNextSelectedItem(pos);
      TRACE1("Item %d was selected!\n", nItem);
      // you could do your own processing on nItem here
   }
}
Re: Пара вопросов насчет CListCtrl
От: SuperSmile  
Дата: 17.05.03 21:03
Оценка: 2 (1)
Здравствуйте, Korrh, Вы писали:

[покоцано...]
K>Вопрос 2 — получение значения выбранного элемента:

K>у меня под ХР прекрасно работает int zxcv = List.GetHotItem();

K> m_Result = List.GetItemText(zxcv,0);

K>но по неизвестной мне причине ни на 1 компе кроме моего это не идет (видимо все дружно отключили HOVER) хотя по MSDN должно пахать на любом PC с IE 3.x и выше.


K>Приходится использовать нарытое здесь в архивах:


K>POSITION pos = List.GetFirstSelectedItemPosition();

K> int zxcv = List.GetNextSelectedItem(pos);
K> m_Result = List.GetItemText(zxcv,0);

K>что совсем неудобно для юзера, так как для правильной работы ему приходится кликать сначала правой, потом левой или 2 раза левой, криво одним словом.


K>Может есть какой способ хитрый как-то с программой включать опцию Ховер и соотв. выключать при завершении?


Если под "опцию Ховер" понимается автоматическое выделение строки над которой находися мыша,
то
SetExtendedStyle(LVS_EX_TRACKSELECT);


Удачи!
Re: Пара вопросов насчет CListCtrl
От: _Nikolas Россия  
Дата: 17.05.03 22:34
Оценка: 2 (1)
Здравствуйте, Korrh, Вы писали:

K>Вопрос 1 — как в СListCtrl (даже ClistCtrlEx) сделать так, чтобы выбирался не только крайний левый элемент, а вся строка?


List.SetExtendedStyle(LVS_EX_FULLROWSELECT);

K>Вопрос 2 — получение значения выбранного элемента:


CString sText;

int n = List.GetSelectionMark();
sText = List.GetItemText(n, 0);

Удачи.
Re: Пара вопросов насчет CListCtrl
От: Korrh  
Дата: 22.05.03 07:51
Оценка:
Уважаемые, спасибо за ответы, строка выделяется без проблем, но вот с получением значения — та же херня, что и раньше, какой бы способ из здесь перечисленных я не выбирал, в Едите появляется значение только после 2 кликов левой или по одному левой и правой на выбранном элементе. просто уже не знаю что делать
Re: Пара вопросов насчет CListCtrl
От: Korrh  
Дата: 22.05.03 07:54
Оценка:
ну почему под 98 не работает

zxcv = List.GetHotItem();
Re[2]: Пара вопросов насчет CListCtrl
От: Patalog Россия  
Дата: 22.05.03 09:49
Оценка:
Здравствуйте, Korrh, Вы писали:

[]

А что тебе мешает сделать CListCtrl::EditLabel по первому клику?
Ловишь NM_CLICK и EditLabel для NMITEMACTIVATE::iItem.
Почетный кавалер ордена Совка.
Re[3]: Пара вопросов насчет CListCtrl
От: Korrh  
Дата: 22.05.03 10:20
Оценка:
Здравствуйте, Patalog, Вы писали:

P>А что тебе мешает сделать CListCtrl::EditLabel по первому клику?

P>Ловишь NM_CLICK и EditLabel для NMITEMACTIVATE::iItem.

не надо редактировать лист. можно кликнуть на строке в листе и в едите появится код МФО, а можно не искать его и сразу ввести руками.
Re[4]: Пара вопросов насчет CListCtrl
От: Patalog Россия  
Дата: 22.05.03 11:35
Оценка:
Здравствуйте, Korrh, Вы писали:

[]

K>не надо редактировать лист. можно кликнуть на строке в листе и в едите появится код МФО, а можно не искать его и сразу ввести руками.


Абаждите. Ты какой едит имеешь в виду? Некий "внешний" едит? Если да, то тогда вообще проблемы не вижу — тотже NM_CLICK и у тебя уже есть item, т.е. позиция элемента в листе. Тебе же вроде именно это и надо? Т.е.
const NMITEMACTIVATE* item_activate = reinterpret_cast<NMITEMACTIVATE *>(lParam);
const int item = item_activate->iItem;
CString text = List.GetItemText(item, 0);
Почетный кавалер ордена Совка.
Re[5]: Пара вопросов насчет CListCtrl
От: Korrh  
Дата: 22.05.03 11:54
Оценка:
Здравствуйте, Patalog, Вы писали:


P> у тебя уже есть item, т.е. позиция элемента в листе.

P>[/ccode]
P>const NMITEMACTIVATE* item_activate = reinterpret_cast<NMITEMACTIVATE *>(lParam);
P>[/ccode]

ну да, элемент CEdit. сорри за неправильную формулировку =(
подожди, item — тот что нужен, откуда он берется???? на lParam ругается =( ничего не понимаю =(
Re[6]: Пара вопросов насчет CListCtrl
От: Patalog Россия  
Дата: 22.05.03 12:09
Оценка: 5 (2)
Здравствуйте, Korrh, Вы писали:

[]

lParam — это ежели на API. На MFC так:
afx_msg void OnClickList(NMHDR*, LRESULT*); //объявление

...
ON_NOTIFY(NM_CLICK, IDC_MY_COOL_LIST, OnClickList) //in message map
...

void CMyParentWindowForList::OnClickList(NMHDR* nmhdr, LRESULT* result) //определение
{
    const NMITEMACTIVATE* item_activate = reinterpret_cast<NMITEMACTIVATE *>(nmhdr);
    const int item = item_activate->iItem;
    CString text = List.GetItemText(item, 0);
    
    *result = 0;
}
Почетный кавалер ордена Совка.
Re[7]: Пара вопросов насчет CListCtrl
От: Korrh  
Дата: 22.05.03 12:15
Оценка:
Спасибо большое!
Re[8]: Пара вопросов насчет CListCtrl
От: Vicont Россия  
Дата: 22.05.03 13:14
Оценка:
Здравствуйте, Korrh, Вы писали:

[]

Может уже поздно но всетаки, я всегда делал так:

int i = GetListCtrl()->GetNextItem(-1,LVS_SELECTED);

срабатывало с первого раза.
тестилось под 98, 2000 ХР
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.