Нужна помощь из области MFC (VC++)

Arina_Kulikova

Народ! Есть тут кто-нибудь кто ХОРОШО шарит в MFC? Конкретнее: нужна одна функция из класса CListBox. Кто-нибудь с ним вплотную работал? Если найдется знающий человек, тогда сформулирую вопрос.

okunek

пиши вопрос... можешь в приват...

Arina_Kulikova

В классе CListBox есть функция, которая на данный элемент списка ставит И подсветку И каретку. Есть функция, которая на данный элемент списка ставит ТОЛЬКО каретку. А мне нужна функция, которая ставит ТОЛЬКО подсветку. Есть ли такая вообще? Или как по другому добиться такого эффекта?

marizha

использовать одновременно

Arina_Kulikova

Более обще задача выглядит так: есть объект класса CListBox. Он заполнен N строками. И я хочу, чтобы некоторые из этих строк были постоянно подсвечены. Как этого можно добиться?
ЗЫ: список с несвязанным(множественным) выбором.

okunek

Вообще, каретка появляется, когда листбокс является активным (в фокусе). Можно в событии ON_LBN_SELCHANGE вставить следующую строчку : SetCurSel(-1). Тогда остается только одна каретка. Единственный артефакт, который здесь появляется - это то, что когда ты выделяшь какой-то элемент, то сначала он выделяется, а потом эта подсветка исчезает, но такое моргание заметно. Другой выход (более гемморойный) - это переписать отрисовку элементов.

Arina_Kulikova

Дак мне нужна подсветка без каретки, а не наоборот!

okunek

аа, тупанул... ща...

okunek

ну тогда при выделении ставь фокус на другой элемент. Каретка исчезнет.

Arina_Kulikova

Не уверен, что понял тебя правильно, но ща попробую. Можешь пока поподробнее написать?

okunek

создаешь event LBN_SELCHANGE.
в него вставляешь следующую строчку (даже фокус не надо никуда ставить): mylistbox.SetCaretIndex(-1)

Arina_Kulikova

В принципе работает, но не так как мне надо. Наверно я немного неправильно сформулировал проблему. Вобщем мне надо такой ЛистБох как тут:
Видишь там часть строк подсвечена серым? Вот как так сделать? Причем можно свободно выбирать любую строку, а подсветка не исчезает.

kokoc88

Надо ставить OWNER DRAW FIXED.

Arina_Kulikova

а поконкретней? что где поставить?

kokoc88

Поставить флажок Owner Draw Fixed. Посмотреть хэлпы. Т.е. тебе придётся самому рисовать.
Ещё можно попробовать найти готовый компонент.

okunek

7-ю главу, Advanced Control Programming

Arina_Kulikova

Почему когда я ставлю флажок Owner Draw Fixed, прога не запускается? Что надо ещё обязательно сделать, когда ставишь этот флаг? Вроде надо переопределить функцию DrawItem. Но я это и сделал: protected: virtual void DrawItem(...); и её реализация. Не помогает. В чем ошибка?

kokoc88

Она не protected.

kokoc88

Хотя, это не важно. Что именно у тебя происходит? Покажи кусок кода, где ты определил функцию.

kokoc88

Кстати, какой Вижуал ты используешь? В 7-ом есть всё, что тебе надо.

okunek

Надо еще OnMeasureItem сделать.

kokoc88

Не обязательно, только если он хочет строки разного размера.

Arina_Kulikova

А что это за шняга OnMeasureItem ? Что в ней писать?
В функции DrawItem у меня строчек 7. Взял из одной документации, т.е. проблема не в них. Ведь по-моему даже если эту функцию пустой сделать, всё должно работать. А у меня даже с пустой не пашет. Нажимаю CTRL-F5 и сразу окошко: STOP, DEBUG, CANCEL.
ЗЫ: использую Microsoft Visual C++ 6.0. А где можно взять 7-ю? И чем она лучше?

okunek

Я так понимаю, у тебя отдельный класс для листбокса? В любом случае, запость сюда все строки, касающиеся листбокса, в том числе и строчки, где у тебя он создается. А то так мало понятно...
ЗЫ. Ссылка, что я привел выше, все еще остается в действии. Там реально все подробно и доходчиво написано.
ЗЗЫ.Забей на 7-й vc++.

kokoc88

Ну дак ты хоть напиши, на какой строке у тебя валится?

Arina_Kulikova

Вот создал простой новый проект на основе диалога при помощи Wizard'a. Вставил в диалог ListBox. Добавил в него две строчки. Запускаем - всё пашет. Теперь меняем в Box'e менюшку Owner Draw на Fixed. И всё - не работает прога. Вот у меня примерно та же ситуация. Заставьте этот поект работать и скажите, как вы это сделали. И тогда я смогу свой проект поправить.

kokoc88

Ах, ты вставляешь CListBox, лучше CListCtrl. В чём проблема была посмотреть, где именно падает, нажав "Retry" ?
// Derived class is responsible for implementing these handlers
// for owner/self draw controls (except for the optional DeleteItem)
void CListBox::DrawItem(LPDRAWITEMSTRUCT)
{ ASSERT(FALSE); }
void CListBox::MeasureItem(LPMEASUREITEMSTRUCT)
{ ASSERT(FALSE); }
int CListBox::CompareItem(LPCOMPAREITEMSTRUCT)
{ ASSERT(FALSE); return 0; }
void CListBox::DeleteItem(LPDELETEITEMSTRUCT)
{ /* default to nothing */ }
int CListBox::VKeyToItem(UINT, UINT)
{ return Default; }
int CListBox::CharToItem(UINT, UINT)
{ return Default; }

Arina_Kulikova

Ну ты мне помог блин, просто зашибись. Ты хоть мой пост читал? Я же не спрашивал, с помощью каких ещё объектов это можно реализовать. У меня ListBox и точка. Я же попросил: "Заставьте ЭТОТ(!) проект работать и скажите, как вы это сделали." А ты мне какой-то левый суешь. А кнопка RETRY мне мало что говорит. Все равно в debug'e не понимаю в чем ошибка. Так что буду благодарен, если кто-нить заставит работать именно этот проект.

kokoc88

Батенька, дак вам тогда надо учиться на СИ++ программировать.
Оставить комментарий
Имя или ник:
Комментарий: