Здравствуйте.
среда VC++ 6.0
Есть окно производное от CFormView.
На нем CTabCtrl. Количество вкладок исходно неизвестно. Как и их названия
for(i=0....){
...
m_tab.InsertItem(i, &tci);
}
На каждую вкладку надо поместить диалог с CListCtrl и CTreeCtrl
list = new CDial[pDoc->GetSize()]; // создали диалоги для вкладок
Теперь размещаем диалоги на места
for(i=0; i<pDoc->GetSize(); i++) // пройдемся по количеству и заполним вкладки
{
tci.mask = TCIF_PARAM;
tci.lParam = (LPARAM)&(list[i]);
m_tab.SetItem(i, &tci);
list[i].Create(CDial::IDD, &m_tab);
... // выравнивание, заполнение и visible кого-то из них
}
И вроде бы все здорово. Но. Дело дошло до тыканья в CListCtrl мышой. Что б выбрать столбик сортировки.
И тут вроде работает. Стрелочка моя рисуется. Только стираться не желает.
void CDial::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
HDITEM hdi;
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
m_tabl.GetHeaderCtrl()->GetItem(0, &hdi); // запрос у CListCtrl чего там в нулевой колонке с заголовком
...
и hdi.mask говорит что никакой стрелочки там нет. Соответственно понять рисовать или стирать признак сортировки не возможно.
Понять где напортачила не получается. Хотя вру. Есть подозрение на динамическое создание диалога.
Я тут лазила, но то ли поиск задавала неправильно, ничего не нашла.
Может кто подскажет. Ну, или пошлет в правильном направлении. )
12.10.10 00:42: Перенесено из 'C/C++'
Re: Трудности с CListCtrl в динамически созданном диалоге
А> HDITEM hdi = { 0 };
hdi. mask = HDI_FORMAT;
А> NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
А> m_tabl.GetHeaderCtrl()->GetItem(0, &hdi); // запрос у CListCtrl чего там в нулевой колонке с заголовком
А>и hdi.mask говорит что никакой стрелочки там нет. Соответственно понять рисовать или стирать признак сортировки не возможно.
mask нужно заполнить самостоятельно перед вызовом GetItem, указав что именно интересует (см. код с полужирным шрифтом).
Потом анализировать hdi. fmt на предмет HDF_SORTUP/HDF_SORTDOWN.
Re: Трудности с CListCtrl в динамически созданном диалоге
Дело дошло до тыканья в CListCtrl мышой. Что б > выбрать столбик сортировки. > И тут вроде работает. Стрелочка моя рисуется. Только стираться не желает. > void CDial::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult) > { > HDITEM hdi; > NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; > > m_tabl.GetHeaderCtrl()->GetItem(0, &hdi); // запрос у CListCtrl чего там в > нулевой колонке с заголовком > ... > > и hdi.mask говорит что никакой стрелочки там нет. Соответственно понять рисовать > или стирать признак сортировки не возможно. > Понять где напортачила не получается. Хотя вру. Есть подозрение на динамическое > создание диалога.
Как бы ListCtrl знаем. Но не понятно, что ж у тебя не получается.
Где ж ты предполагаешь эту стрелку увидать.
Notifies a list-view control's parent window that a column was clicked. This
notification message is sent in the form of a WM_NOTIFY message.
Syntax
LVN_COLUMNCLICK
pnmv = (LPNMLISTVIEW) lParam;
Parameters
pnmv
Pointer to an NMLISTVIEW structure. The iItem member is -1, and the iSubItem
member identifies the column. All other members are zero.
mask вообще-то задаёт только, какие поля структуры HDITEM заданы, а какие — нет.
Перед вызовом GetItem ставишь в mask (среди прочих) флаг HDI_FORMAT,
и получаешь в fmt значения :
fmt
Flags that specify the item's format.
...
HDF_SORTDOWN
Version 6.00. Draws a down-arrow on this item. This is typically used to
indicate that information in the current window is sorted on this column in
descending order. This flag cannot be combined with HDF_IMAGE or HDF_BITMAP.
HDF_SORTUP
Version 6.00. Draws an up-arrow on this item. This is typically used to indicate
that information in the current window is sorted on this column in ascending
order. This flag cannot be combined with HDF_IMAGE or HDF_BITMAP.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Трудности с CListCtrl в динамически созданном диалоге
Ну... после энного прочтения до меня дошло.)) Что перед тем как задать вопрос заголовку, надо бы ему сказать о чем я собственно спрашиваю.
Запомню. Спасибо.
Стрелка у меня самопальная, а сортировка идет по столбцам. Ну, либо по столбику "Тип", либо по столбику "Адрес", и т.д.
Т.е. сортировки по убыванию и возрастанию нет.
Я предполагала в заголовке отмечать колонку по которой сортирую наличием значка.
То разрешить рисовать стрелку, то запретить.
И эта... я победила!! Правда малешко не поняла, ща спрашивать буду.
Собстно, на форуме и накопала.
Функ-я обработки нажатия теперь выглядит так.
// стираем старый признак, если есть
if(nCol >= 0){
hdi.mask=HDI_TEXT;
hdi.pszText=cStr;
hdi.cchTextMax=100;
m_tabl.GetHeaderCtrl()->GetItem(nCol, &hdi);
hdi.mask=HDI_TEXT|HDI_FORMAT;
hdi.fmt=HDF_LEFT|HDF_STRING;
m_tabl.GetHeaderCtrl()->SetItem(nCol, &hdi);
}
// кто у нас дежурный
nCol = pNMListView->iSubItem;
*pResult = 0;
}
Я не до конца поняла. Когда делаем GetItem надо указать у чем спрашиваем. И только эту информацию получим.
Тут я говорю что хочу получить текст, и получаю.
А когда SetItem, все что указано в mask будет использоваться при отображении объекта.
Говорю что будет рисоваться текст, и только текст, при чем прижатый вправо. Что и видно в результате.
Следовательно всякие вычитания типа
hdi.mask &=~ HDI_IMAGE;
бессмысленны?
Забодалась бодаться с таким простым действием))
Ощущаю легкую эйфорию. Была б королевой, была бы в восхищении. ))
Спасибо за помощь.