Трудности с CListCtrl в динамически созданном диалоге
От: Анна  
Дата: 11.10.10 13:51
Оценка:
Здравствуйте.
среда 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 в динамически созданном диалоге
От: McQwerty Россия  
Дата: 11.10.10 13:58
Оценка:
Здравствуйте, Анна, Вы писали:

А> 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 в динамически созданном диалоге
От: MasterZiv СССР  
Дата: 11.10.10 14:20
Оценка:
On 11.10.2010 17:51, Анна wrote:

Дело дошло до тыканья в 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 знаем. Но не понятно, что ж у тебя не получается.
Где ж ты предполагаешь эту стрелку увидать.

LVN_COLUMNCLICK Notification

--------------------------------------------------------------------------------

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 в динамически созданном диалоге
От: Анна  
Дата: 12.10.10 09:03
Оценка:
Здравствуйте, McQwerty
Здравствуйте, MasterZiv

Ну... после энного прочтения до меня дошло.)) Что перед тем как задать вопрос заголовку, надо бы ему сказать о чем я собственно спрашиваю.
Запомню. Спасибо.
Стрелка у меня самопальная, а сортировка идет по столбцам. Ну, либо по столбику "Тип", либо по столбику "Адрес", и т.д.
Т.е. сортировки по убыванию и возрастанию нет.
Я предполагала в заголовке отмечать колонку по которой сортирую наличием значка.
То разрешить рисовать стрелку, то запретить.

И эта... я победила!! Правда малешко не поняла, ща спрашивать буду.
Собстно, на форуме и накопала.
Функ-я обработки нажатия теперь выглядит так.

void CDial::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
HDITEM hdi;
static int nCol=-1; // запоминает текущий столбик
char cStr[100];
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

if(nCol!=-1 && pNMListView->iSubItem==nCol) // повторное нажатие.
return; // игнорим, ибо уже отсортировано

if(!m_tabl.GetHeaderCtrl()->GetImageList())
m_tabl.GetHeaderCtrl()->SetImageList(&m_image);

// рисуем признак сортировки
m_tabl.GetHeaderCtrl()->GetItem(pNMListView->iSubItem, &hdi);
hdi.mask = HDI_IMAGE|HDI_FORMAT;
hdi.fmt = HDF_LEFT|HDF_IMAGE |HDF_STRING ;
hdi.iImage=0;
m_tabl.GetHeaderCtrl()->SetItem(pNMListView->iSubItem, &hdi);

// стираем старый признак, если есть
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;
бессмысленны?

Забодалась бодаться с таким простым действием))
Ощущаю легкую эйфорию. Была б королевой, была бы в восхищении. ))
Спасибо за помощь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.