
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.91] |
![]() |
|
![]() |
|
|
Помогите плиз!!!
Есть CListCtrl с стилем LVS_REPORT, нужно при нажатии на левой кнопки мыши на поле изменять значение поля. Как это сделать? В доках нашёл что надо обработать OnEndlabeledit, ничё не получается ![]() |
Сообщ.
#2
,
|
|
|
Надо еще разрешить само редактирование итема в его свойствах.
А потом - да, действительно, ловить нотификацию LVN_ENDLABELEDIT (добавь визардом Event Handler, чтоб не мучиться) и при необходимости, переписываешь новую строку в итем. |
Сообщ.
#3
,
|
|
|
Посмотри здесь. Если не разберешься, еще один пример скину
Прикреплённый файл ![]() |
Сообщ.
#4
,
|
|
|
Александр Цикин
я разрешил редактирование итема в его свойствах, поймал нотифекацию LVN_ENDLABELEDIT. А потом что делать разобраться не могу ![]() пробовал делать SetItemText(), не меняет. Kezya спасибо за пример, но мне не надо так сложно,мне надо чтоб только первое поле можно было изменять. |
Сообщ.
#5
,
|
|
|
Вот тебе выжимка из книги по редактированию первой колонки Itema:
Цитата LVN_BEGINLABELEDIT LVN_ENDLABELEDIT Цитата Если при создании органа управления List View был указан стиль LVS_EDITLABELS, пользователь сможет редактировать имена элементов списка. Для этого достаточно выделить нужный элемент и сделать по нему щелчок левой клавишей мыши. Примерно через секунду появится окно редактирования имени "по месту". Такой способ пригоден в любом режиме работы органа управления List View. Перед началом редактирования имени элемента списка родительское окно получает извещение LVN_BEGINLABELEDIT. Если обработчик этого сообщения возвратит ненулевое значение, редактирование будет заблокировано. Таким образом можно запретить пользователю редактировать названия некоторых элементов списка. В простейшем случае обработчик извещения LVN_BEGINLABELEDIT может выглядеть так: ![]() ![]() case LVN_BEGINLABELEDIT: { return 0L; break; } Цитата Когда пользователь завершил редактирование имени элемента списка, родительскому окну передается извещение LVN_ENDLABELEDIT. При этом параметр lParam сообщения WM_NOTIFY содержит адрес структуры LV_DISPINFO. Обработчик извещения LVN_ENDLABELEDIT может, например, обновить имя элемента в структуре данных, где это имя хранится. Если пользователь отменил редактирование, в поле item.iItem будет находиться значение -1. В этом случае обновление выполнять не нужно: ![]() ![]() case LVN_ENDLABELEDIT: { if((lpLvdi->item.iItem != -1) && (lpLvdi->item.pszText != NULL)) lstrcpy(lpAppinfo->szAppName, lpLvdi->item.pszText); return 0L; break; } |
Сообщ.
#6
,
|
|
|
IEZ
спасибо я єто тоже нашел только-что, но я воспользовался другим способом ![]() ![]() ![]() CString str; CEdit * edit = pole01.GetEditControl(); edit->GetWindowText(str); pole01.SetItemText(cursel,subcursel,str); |
Сообщ.
#7
,
|
|
|
Вообще почитай книгу: Том 22 Операционная система Windows 95 для программиста.
Вне расписана работа с большинством интерфейсных контролов. Вот ее оглавление: Цитата ВВЕДЕНИЕ 1 НОВОСТИ, ХОРОШИЕ И РАЗНЫЕ 1.1. Хорошие новости 1.2. Особенности программирования для Win32 1.3. Первое приложение для Microsoft Windows 95 2 ОРГАНЫ TOOLBAR И STATUSBAR 2.1. Орган управления Toolbar 2.2. Орган управления Statusbar 2.3. Приложение Smart Application 3 РАБОТА С ТАБЛИЦАМИ И СПИСКАМИ 3.1. Создание органа управления List View 3.2. Обработка извещений 3.3. Сообщения для органа управления List View 3.4. Изменение режима просмотра списка 3.5. Приложение List Application 4 ПРОСМОТР ДЕРЕВЬЕВ 4.1. Создание органа управления Tree View 4.2. Обработка извещений 4.3. Сообщения для органа управления Tree View 4.4. Приложение Some Books 5 РЕДАКТОР ТЕКСТА RICH EDIT CONTROL 5.1. Создание органа управления Rich Edit 5.2. Сообщения для органа управления Rich Edit 5.3. Обработка извещений 5.4. Приложение RtfPad 6 БЛОКНОТ И НЕМНОГО ВОЛШЕБСТВА 6.1. Создание органа управления Property Sheet 6.2. Обработка извещений 6.3. Посылка сообщений 6.4. Приложение Property Sheet Demo 6.5. Приложение Wizard Demo 7 ЕЩЕ НЕСКОЛЬКО НОВЫХ ОРГАНОВ УПРАВЛЕНИЯ 7.1. Орган управления Trackbar 7.2. Орган управления Progressbar 7.3. Орган управления Animation 7.4. Приложение Compact Disk Player 7.5. Орган управления Up-Down 7.6. Орган управления Hot Key 7.7. Приложение UpDown ЛИТЕРАТУРА |
Сообщ.
#8
,
|
|
|
А как для CListCtrl с стилем LVS_REPORT и LVS_EDITLABELS запретить редактирование первой колонки, разрешив редактирование всех остальных?
Цитата Перед началом редактирования имени элемента списка родительское окно получает извещение LVN_BEGINLABELEDIT. Если обработчик этого сообщения возвратит ненулевое значение, редактирование будет заблокировано. Таким образом можно запретить пользователю редактировать названия некоторых элементов списка. Это не работает. |
![]() |
Сообщ.
#9
,
|
|
LVS_EDITLABELS предназначен только для редактирования 1й колонки
решение: убрать этот стиль, а на месте редактирования остальных итемов, создавать динамически дочерний Edit итд 4й там реализация редактируемого ListBox, для понимания должно подойти |
Сообщ.
#10
,
|
|
|
Цитата решение: убрать этот стиль, а на месте редактирования остальных итемов, создавать динамически дочерний Edit итд Спасибо, это помогло. Второй день долблюсь - что только ни перепробовал - ничего не помогало. Помогло лишь отключение стиля LVS_EDITLABELS в обработчике LVN_BEGINLABELEDIT в случае, если HitTest показал, что кликнута первая колонка. Остальные колонки при этом редактируются без проблем (при помощи временного Edit'а), включать для них специально LVS_EDITLABELS даже не потребовалось (а LVS_EDITLABELS у меня выставлен в визуальном редакторе List Control Properties - Styles - Edit labels). |
Сообщ.
#11
,
|
|
|
На всякий случа приведу исходный код - вдруг кому ещё пригодится:
![]() ![]() void CMyListBox::OnBeginLabelEdit(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here CPoint posMouse; GetCursorPos(&posMouse); ScreenToClient(&posMouse); LVHITTESTINFO htest; htest.pt=posMouse; htest.flags=0; SubItemHitTest(&htest); if (htest.flags & LVHT_ONITEMLABEL && htest.iSubItem) { int shift = 1; HWND hWnd=(HWND)SendMessage(LVM_GETEDITCONTROL); ASSERT(hWnd!=NULL); VERIFY(m_LVEdit.SubclassWindow(hWnd)); CDC* pdc = m_LVEdit.GetDC(); COLORREF crOldBkColor = pdc->GetBkColor(); pdc->SetBkColor(::GetSysColor(RGB(255,0,0))); CRect rcItem; GetSubItemRect(htest.iItem,htest.iSubItem,LVIR_LABEL,rcItem); m_LVEdit.m_x=rcItem.left-shift; m_LVEdit.m_y=rcItem.top; m_LVEdit.m_cy=rcItem.Height(); m_LVEdit.m_cx=rcItem.Width()+shift; m_LVEdit.MoveWindow(rcItem,true); CRect rcItem2; rcItem2.top = m_LVEdit.m_y; rcItem2.left = m_LVEdit.m_x; rcItem2.bottom = m_LVEdit.m_cy; rcItem2.right = m_LVEdit.m_cx; m_LVEdit.SetWindowText(GetItemText(htest.iItem,htest.iSubItem)); POINT point; point.x = m_LVEdit.m_x; point.y = m_LVEdit.m_y; pdc->SetBkColor(crOldBkColor); m_nEdit=htest.iSubItem; } else SetStyle(LVS_REPORT|LVS_OWNERDRAWFIXED); *pResult=0; } Код вообще-то взят из некоего примера из Интернета (забыл линк), и мною модифицирован. Очень важной является проверка ![]() ![]() if (htest.flags & LVHT_ONITEMLABEL) Ещё куски кода для понимания: ![]() ![]() void CMyListBox::SetStyle(DWORD NewStile) { ASSERT(::IsWindow(m_hWnd )); DWORD a2 = GetWindowLong(m_hWnd,GWL_STYLE); if ((a2 & LVS_TYPEMASK) != NewStile) SetWindowLong(m_hWnd, GWL_STYLE , (a2 & ~LVS_TYPEMASK) | NewStile); } ![]() ![]() ///////////////////////////////////////////////////////////////////////////// // CMyEdit window class CMyEdit : public CEdit { // Construction public: CMyEdit(); int m_x; int m_y; int m_cx; int m_cy; // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMyEdit) //}}AFX_VIRTUAL // Implementation public: virtual ~CMyEdit(); // Generated message map functions protected: //{{AFX_MSG(CMyEdit) afx_msg void OnWindowPosChanging(WINDOWPOS FAR* lpwndpos); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// class CMyListBox : public CListCtrl { // Construction public: CMyListBox(); void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct); .... void SetStyle(DWORD NewStile); ... CMyEdit m_LVEdit; BOOL m_nEdit; .... // Generated message map functions protected: //void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); //{{AFX_MSG(CMyListCtrl) afx_msg void OnBeginLabelEdit(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; |