Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > CListCtrl.Редактируем внутри.


Автор: Coocky 17.11.2004, 16:26
Надоело работать с БД с помощью RecordView?Исправим smile
Создаем 2 класса CMyedit:public CEdit и CMyList:public CListCtrl;
ListCtrl со стилем LVS_REPORT+ExtendedStyle FULLROWSELECT и GRID(не помню по аглицки,но стиль репорт,выделение все строки и сетка).см. МСДН SetExtendedStyle()
В CMyedit создаем сообщение WM_POSCHANGING
Код

MyEdit::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
CEdit::OnWindowPosChanging(lpwndpos);
lpwndpos->x=m_x;
lpwndpos->y=m_y;
if (lpwndpos->cx<m_cx)lpwndpos->cx=m_cx;
if (lpwndpos->cy<m_cy)lpwndpos->cy=m_cy;

Добавляем класс CMyedit в CMyList.Создаем обьект m_Edit.Вызываем m_Edit.Create(.......CRect(0,0,0,0)...);
В CMyList создаем обработчик сообщения на двойное нажатие кнопки мыши
в нем пишем
Код

CPoint posMouse;
   GetCursorPos(&posMouse);// получаем координаты щелканья мыши

   ScreenToClient(&posMouse);// переводим

LV_HITTESTINFO htest;//структура листа,малоизвестная многим

htest.pt=posMouse;

htest.flags=0;

   CRect rcItem;
 
MyClass::SubItemHitTest(&htest);//Заполняем  

//получаем координаты столбца
MyClass::GetSubItemRect(htest.iItem,htest.iSubItem,LVIR_LABEL,rcItem);


// подгоняем для красоты
rcItem.bottom=rcItem.bottom-1;
rcItem.right=rcItem.right-1;
m_Edit.m_x=rcItem.left;
   m_Edit.m_y=rcItem.top;

m_Edit.m_cy=rcItem.Height();
m_Edit.m_cx=rcItem.Width();
if(IsWindow(m_Edit.m_hWnd)){

m_Edit.MoveWindow(rcItem,true);//перемещаем
}
}

Поясню:MyEdit::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) избавляет от глюков и дает халявный ресайзинг при изменении размеров.
FULLROWSELECT только этот стиль позволит получит номер стобца.Иначе он будет равен -1.
Убирать или показывать окно CMyEdit можно с помощью m_Edit.ShowWindow(FALSE/TRUE).
А теперь представьте,вместо едита листбокс или комбо или CRichEdit со встроеным OLE контейнером smile И закружило - понесло smile

Автор: CLIPSA 7.6.2008, 18:27
Здорово конечно! 
Но мне не нравится, что при FULLROWSELECT выделяется вся строка. Некрасиво. Как это устранить?
И как высоту строк менять? (Хочу таблицу с огромными ячейками  smile )

Автор: Earnest 10.6.2008, 07:42
Изменить высоту строки в листе можно, но только она будет одинаковая для всех строк. Делается просто: создаете картинку-пустышку шириной 1 и высотой какую хотите. Создать на ее основе CImageList и установить его в качесте в лист-контрол (SetImageList).  Именно картинка и определяет высоту строки.
Насчет FULLROWSELECT - просто отключи этот стиль. Coocky неправ, и без него все сработает (в смысле SubItemHitTest). 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)