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

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

Мне нужно сделать ListCtrl , в котором пять столбцов. В первом - текст, а в остальных - иконки-битмэпки. Текстовые строки выводить не проблема, а вот как быть с иконками? У меня пока не получилось.

Кто делал нечто подобное, подскажите пожалуйста.
Спасибо.
Записан
Джон
просто
Администратор

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

« Ответ #1 : 18-05-2006 12:26 » 

Теория простая - делаешь свой контрол : public CListCtrl, в нём переписываешь виртуальную ф-ю DrawItem.  Практически в этой ф-ции ты получаешь окошко (прямоугольник), в котором можешь рисовать всё, что хочешь. Конкретных примеров с кодом полно на codeproject/codeguru. Да ещё у контрола должен быть стиль LVS_OWNERDRAWFIXED. Ну а остальное дело техники.

зы Может чего и забыл, но вроде так.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Джон
просто
Администратор

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

« Ответ #2 : 18-05-2006 12:40 » 

Её там и не будет. Читай внимательно - "виртуальная".
У тебя какя студия? В 6ой правой кнопкой в классах по твоему ЛК - там кажется есть пункт виртуальную ф-ю добавить.

В дот нет -  зелёный кубик - типа как OnInitDialog добавляешь
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Richi
Гость
« Ответ #3 : 18-05-2006 12:45 » 

Студия восьмая. Я с ней еще не до конца разобрался. А OnInitDialog я до сих пор добавлял вручную...
Сейчас попробую
Записан
Richi
Гость
« Ответ #4 : 18-05-2006 12:51 » 

Правой кнопкой можно добавить класс или переменную
Записан
Джон
просто
Администратор

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

« Ответ #5 : 18-05-2006 12:59 » new

Правая кнопка была в 6ой студии. Во всех остальных по другому.

У тебя в Propeties - в тулбаре есть 3 кнопки Events Messages Overrrides

Тебе нужна Overrrides, ну или добавляй вручную. Я вот ща задал в гугле - вот тебе даже сразу код

Код:
void CListCtrlEx::DrawItem(LPDRAWITEMSTRUCT ld) 
{
         CHeaderCtrl* pHeader = GetHeaderCtrl( );
         int nCols = pHeader->GetItemCount( );
         CRect rf;
         int nVertPos = GetScrollPos(SB_VERT);
         
         for (int nIndex=0; nIndex<nCols; nIndex++)
         {
              GetSubItemRect( ld->itemID, nIndex,LVIR_BOUNDS , rf);
              rf.top -= nVertPos;
              rf.bottom = rf.top + m_fnt_tm.tmHeight;
                       
             // draw what ever you like on the rf rectangle...
         }
}

Взято отсюда
http://www.codeproject.com/Purgatory/flplst.asp


зы Задал конечно для поиска CListCtrl DrawItem

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Richi
Гость
« Ответ #6 : 18-05-2006 13:20 » 

Override есть только на класс. Там действительно список виртуальных функций.
На контрол Override нет.
За примерчик спасибо.
Записан
Джон
просто
Администратор

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

« Ответ #7 : 18-05-2006 13:38 » 

Richi, аааа издеваешься?
Что значит контрол? Это и есть класс. То, что ты видишь в редакторе ресурсов - только темплйт контрола - другими словами - инфа о стилях, размерах и позиции - больше ничего.

Код:
CONTROL   "List1",IDC_LIST1,"SysListView32",LVS_REPORT | 
                LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,7,125,264,115

Никакой функциональности там нет. Вся функциональность находится в объекте.

Например:
class CMyListCtrl : public CListCtrl

Насчёт примера - посмотри ещё - ключевые слова есть. Может найдёшь что-то получше. Я сам с картинками никогда не делал. Кажется на codeguru был пример именно с картинками в CListCtrl
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Richi
Гость
« Ответ #8 : 18-05-2006 13:55 » 

Сорри. Я и не думал издеваться. Видимо я опять что-то  недопонял.
Я вот еще один примерчик нашел:
http://www.codeproject.com/listctrl/listctrldemo.asp
В общем, направление понятно. Думаю, что смогу сделать.
Большое спасибо за помощь.
Записан
Джон
просто
Администратор

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

« Ответ #9 : 18-05-2006 14:11 » 

Это не совсем то, что тебе надо. Это общие сведения как с ним работать. ХОтя конечно это тоже важно, и лучше с этого начать. Я посмотрю вечерком примерчики - добавь ещё в поиск след.

CListCtrl DrawItem Own Item
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Richi
Гость
« Ответ #10 : 18-05-2006 15:03 » 

ОК.
В том примерчике, что ты прислал, не совсем понятно, как заполнить структуру DRAWITEMSTRUCT перед вызовом DrawItem.
Я сделал так:
Код:
	DRAWITEMSTRUCT	ld;
ld.CtlType = ODT_LISTBOX;
ld.CtlID = IDC_MY_LIST;
ld.itemAction = ODA_DRAWENTIRE;
ld.itemState = ODS_DEFAULT;
ld.itemID = -1;
Тогда функция GetSubItemRect кричит.
« Последнее редактирование: 18-05-2006 15:07 от Richi » Записан
Джон
просто
Администратор

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

« Ответ #11 : 18-05-2006 17:21 » 

Richi, Ага Ты получаешь эту структуру. Смотри - это очень просто. Есть некий контрол, который отрисовывает стандартное состояние контрола. Это происходит примерно так:

class CBaseControl
....

void DrawControll()
{
    MyStructure ms;
    mc.param1 = 1;
    mc.param2 = 2;

    DrawMe(ms);  // полиморфный вызов виртуальной ф-ции структура заполнена и передаётся в ф-ю
     
}

virtual void DrawMe(MyStructure ms) { this->DrawStdState(ms); }

Наследуем наш контролл от базового класса

class CMyCtrl : public CBaseControl
....
void DrawMe(MyStructure ms) { DrawOwnState(ms); } // переписываем виртуальную ф-ю и пользуемся значением параметра

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Richi
Гость
« Ответ #12 : 18-05-2006 19:47 » 

Действительно просто.  Скромно так...
Попробую сделать. Только я теперь на работе буду в воскресенье.
Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines