ListView Control помогите
я выставляю стиль report внешне это таблица а ведет себя как список.помогите пожалуйста!
я хотел зделать таблицу через ListView ее вообще можно через него зделать или нет?
я выставляю стиль report внешне это таблица а ведет себя как список.помогите пожалуйста!
А что значит "ведет себя как список"?
Чтобы редактировались и другиестолбцы я лично пишу сабкласинг ListView. И внем проверяю ДаблКлик, и вставляю в нужную ячейку Edit, потом по завершению редактирования, забираю Edit а отредактированый текст вставляю в нужную ячейку. То есть визуально редактирование выглядит как в Екселе.
и у меня еще такая проблемма при попытке отослать сообщение LVM_GETSELECTEDCOUNT компилятор ругается и на макрос тоже ругается что это неизвестая переменная как с эти бороться?
приведи пожалуйста кусок кода как это делать.
и у меня еще такая проблемма при попытке отослать сообщение LVM_GETSELECTEDCOUNT компилятор ругается и на макрос тоже ругается что это неизвестая переменная как с эти бороться?
На счет LVM_GETSELECTEDCOUNT, то это возможно если у тебя не подключен #include <Commctrl.h>
Исходник закину чуть позже (надо его выдрать из проги)
в том то и дело что я подключаю commctl а он его всеравно не видит
:)))))))))
ХМ, (кстати не commctl, а commctrl), тогда ищеш этот файл через коммандер (может у Тебя его просто нет). Копируеш в папку с прочектом и пишеш #include "Commctrl.h". Именно с такими кавычками. Если такой файл существует, то все должно пахать
как там на счет исходников?
Вот исходники, только их никому ! :)
Если что неясно, то на мыло пиши.
Класс походу просто использовать. Create, InsertColumn, InsertItem, короче там по названиям все понятно, еще и ремарки есть (на украинском, конечно).
Большое спасибо за исходники!ток я разобраться немогу=)немог бы ты коментариев побоше сделать .особенно в BeginEdit().заранее спасибо!
Ну, идея следующая:
Во-первых можно устанавливать какие столбцы редактируются, а какие нет.
Теперь на счет BeginEdit:
Тут дописаны все необходимые для понимания комментарии
void CMList::BeginEdit(int xPos, int yPos, bool How)
{
RECT rc = {0, 0, 0, 0};
if(IsEdit)
EndEdit(false); // это если на данный момент есть уже редактированная ячейка
LVHITTESTINFO phti;
phti.pt.x = xPos;
phti.pt.y = yPos;
//////////////////////
// Тут определяются координаты ячейки, или по прямым значениям, или по координатам на экране
if(!How)
{
phti.flags = LVHT_ONITEMLABEL;
SendMessage(hList, LVM_SUBITEMHITTEST, 0, (LPARAM)&phti);
}
else
{
phti.iItem = yPos;
phti.iSubItem = xPos;
}
if(!IsColumnEdit[phti.iSubItem]) // Перевірка чи можна цей стовбчик правити
return;
// Тут устанавливаются приватные переменные, в которые записывается, какая яейка редактируется
eItem = phti.iItem;
eColumn = phti.iSubItem;
// перемещает если ЛистВью так, чтобы ячейка была видна
SendMessage(hList, LVM_ENSUREVISIBLE, eItem, false);
// Тут узнаются координаты прямоуголной области ячейки
rc.left = LVIR_LABEL;
SendMessage(hList, LVM_GETITEMRECT, phti.iItem, (LPARAM)&rc);
for(int x=0; x<phti.iSubItem; x++)
rc.left += SendMessage(hList, LVM_GETCOLUMNWIDTH, x, 0);
rc.right = rc.left + SendMessage(hList, LVM_GETCOLUMNWIDTH, phti.iSubItem, 0);
// Тут в найденную прямоугольную область вставляется ЕдитБокс
SetWindowPos(hEdit, HWND_TOP, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, SWP_SHOWWINDOW);
LVITEM lvi;
char Buf[256];
lvi.iSubItem = phti.iSubItem;
lvi.pszText = Buf;
lvi.cchTextMax = 256;
// Тут берется тот текст, что был в ЛистВью и вставляется в едитБокс
SendMessage(hList, LVM_GETITEMTEXT, phti.iItem, (LPARAM)&lvi);
SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)Buf);
SendMessage(hEdit, EM_SETSEL, 0, lstrlen(Buf));
SendMessage(hList, LVM_SETHOTITEM, eItem, 0);
// Устанавливается фокус на ЕдитБокс
SetFocus(hEdit);
IsEdit = true;
}
Вот и все, а вообще это устаревшая версия класса, на днях закину новую. По структуре она точно такая же, только более оптимизировано написана, и глюков меньше.
LVHITTESTINFO phti;
phti.pt.x = xPos;
phti.pt.y = yPos;
//////////////////////
// Тут определяются координаты ячейки, или по прямым значениям, или по координатам на экране
if(!How)
{
phti.flags = LVHT_ONITEMLABEL;
SendMessage(hList, LVM_SUBITEMHITTEST, 0, (LPARAM)&phti);
}
else
{
phti.iItem = yPos;
phti.iSubItem = xPos;
}
после этого всего в phti.iItem и phti.iSubItem всегда лежат -1 и -1. Чего с этим делать?..А когда новую версию выложиш?