Привет всем!
Элемент отличный, но при работе в MDI приложении я заметил одну неприятную особенность: при переключении между MDI окнами FList прокручивается на начало списка (в самый верх), хотя должен бы помнить позицию, на которой стоял курсор ранее
Если добавить много строк, например, 9000, и закрыть программу, то она закрывается, но продолжает висеть в памяти.
Сначала думал в моеу проге глюк,потом проверил и в демо-программе:
в функции CFListDemoDlg::Init() изменил цикл на for(int i=0; i<9000; i++),
результат аналогичный.
Элемент управления классный, но очень хотелось бы иметь возможность выделять сразу несколько элементов. Кроме этого я хочу вывести по нажатию правой кнопки мыши контекстное меню, которое меняется в зависимости от строки, на котором находится мышь. Как это сделать?
после того, как устанавливаю значение TRUE — те только для чтения, как в DEBUG-версии, так и в RELEASE-версии вываливается ексершен после того, как окно с данным контролом активизировано и нажимаю клавишу ESCAPE //// Не очень приятно, буду искать блох, но может быть автор сам быстрее найдет?
Возможно у тебя при переключении между MDI окнами происходит вызов функции SetTextLineCount, которая приводит к вызову MeasureItem. Последняя функции вычисляет высоту строки.
Eсли FList прокручен вниз, то его последующая перерисовка приводит приводит к необъяснимым багам в изображении. Поэтому, чтобы не было лишних проблем, в функции MeasureItem FList прокручивается вверх до упора.
Что касаемо контекстного меню, то в прилагаемом к статье примере показано, как его вызвать (собственно, это делается "как обычно"). При этом, если контекстное меню вызывает правой кнопкой мыши, то строчка, над которой находится указатель, выделяется и её можно заполучить вызовом GetSelectedFRow(), а затем, в зависимости от строки и сформировать контекстное меню.
Если же контекстное меню вызвано нажатием спец. клавиши на клавиатуре, то для определения строки, над которой находится мышь, потребуется небольшое хирургическое вмешательство:)
Для этого в CFListCtrl присутствует функция HitTestMouseClick, но она является protected member, поэтому нужно залезть в исходиники исправить атрибут доступа на public. Кроме того, в этой функции есть небольшой баг и для нормальной работы нужно еще исправить следующий код внутри функции:
int addrow=(point.y-rect.top)/rect.Height();
row+=addrow;
if(row>=bottom || addrow<0)
return FALSE;
После чего можно использовать функцию HitTestMouseClick для определения строки, над которой находится курсор, например так. В этом примере опеределяется ячейка таблицы, над которой находится мышь, из нее "вынимается" текст и помещается в контекстное меню, как новый пункт:
И напоследок одно замечание. Функция HitTestMouseClick возвращает TRUE только если мышь находится над существующей строкой и столбцом одновременно. Если же нужно определить только строку и, при этом не важно, какой столбец, то после вызова HitTestMouseClick проверять следует не ее возвращаемое значение, а значение параметра hFRow. Если перед вызовом функции обнулить hFRow, то после вызова эта переменная будет иметь значение NULL, если курсор не находится не над одной из строк.
Следующий пример аналогичен предыдущему, за тем исключением, что текст для пункта меню всегда берется из первой колонки:
Пробовал устанавливать и TRUE и FALSE, а потом нажимать ESCAPE, но
так ничего и не вывалилось. Не мог бы ты выслать свой проект и
пояснения, что в какой последовательности нажимать, а я посмотрю
Хочется вставить в FListCtrl собственный контрол для редактирования элементов (на базе CEdit).
Не подскажете наиболее "красивый" способ?
Пока что мне приходит в голову только порождение наследника от CFListCtrl.
Здравствуйте, Денис Солоненков, Вы писали:
ДС>Класс CFListCtrl — это элемент управления типа дерево-список для MFC.
Очень хорошо. Но хотелось то же самое под WTL для VC++ 6.0. С комбинацией CListViewCtrl, CTreeViewCtrl (это, как в сабже) и вдобавок — с CProgressBarCtrl.
Пока стараюсь переделать сам, но как то не очень получается
С использованием MFC я почти ничего не делал, подскажите как вывести на печать то что содержится в таблице, ведь если я просто нажимаю предпросмотр там пусто.
Привет.
Очень хороший класс, много функциональный, но в нем отсутсвует одна замечательная особеность, которая мне была ужастно необходима, поетому мне пришлось модифицировать класс самому. А особенность проста, что бы editbox мог иметь свойство password, то есть рисовать звездочки вместо текста. Если кому интерестно то привожу что и куда надо вкрутить что бы такая замечательная особенность появилась.
Во первых в хедернике надо обьявить вот такой дефайн
#define FL_PASSWORD //звездочки в поле ввода
цифирку я такую выбрал так как она не была занята слава богу
теперь надо модифицировать метод в исходнике
BOOL CFListCtrl::DrawElement(int nType, CDC *pDC, HFROW hFRow, int iFColumn, CRect *prcElement)
Собственно тема. Есть комбик — очень нужно отловить момент когда произвели выбор и он захлопнулся.
Кто нить имеет готовое решение или копать и править сорцы?