На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> CListCtrl редактирование item
    Помогите плиз!!!
    Есть CListCtrl с стилем LVS_REPORT, нужно при нажатии на левой кнопки мыши на поле изменять значение поля.
    Как это сделать? В доках нашёл что надо обработать OnEndlabeledit, ничё не получается :(
      Надо еще разрешить само редактирование итема в его свойствах.
      А потом - да, действительно, ловить нотификацию LVN_ENDLABELEDIT (добавь визардом Event Handler, чтоб не мучиться)
      и при необходимости, переписываешь новую строку в итем.
        Посмотри здесь. Если не разберешься, еще один пример скину
        Прикреплённый файлПрикреплённый файлDialog_Based.rar (48.88 Кбайт, скачиваний: 387)
          Александр Цикин
          я разрешил редактирование итема в его свойствах,
          поймал нотифекацию LVN_ENDLABELEDIT.
          А потом что делать разобраться не могу :wall:
          пробовал делать SetItemText(), не меняет.

          Kezya
          спасибо за пример,
          но мне не надо так сложно,мне надо чтоб только первое поле можно было изменять.
            Вот тебе выжимка из книги по редактированию первой колонки Itema:
            Цитата
            LVN_BEGINLABELEDIT
            LVN_ENDLABELEDIT

            Цитата
            Если при создании органа управления List View был указан стиль LVS_EDITLABELS, пользователь сможет редактировать имена элементов списка.

            Для этого достаточно выделить нужный элемент и сделать по нему щелчок левой клавишей мыши. Примерно через секунду появится окно редактирования имени "по месту". Такой способ пригоден в любом режиме работы органа управления List View.

            Перед началом редактирования имени элемента списка родительское окно получает извещение LVN_BEGINLABELEDIT. Если обработчик этого сообщения возвратит ненулевое значение, редактирование будет заблокировано. Таким образом можно запретить пользователю редактировать названия некоторых элементов списка.

            В простейшем случае обработчик извещения LVN_BEGINLABELEDIT может выглядеть так:


            ExpandedWrap disabled
              case LVN_BEGINLABELEDIT:
              {
                return 0L;
                break;
              }


            Цитата
            Когда пользователь завершил редактирование имени элемента списка, родительскому окну передается извещение LVN_ENDLABELEDIT. При этом параметр lParam сообщения WM_NOTIFY содержит адрес структуры LV_DISPINFO.

            Обработчик извещения LVN_ENDLABELEDIT может, например, обновить имя элемента в структуре данных, где это имя хранится.

            Если пользователь отменил редактирование, в поле item.iItem будет находиться значение -1. В этом случае обновление выполнять не нужно:


            ExpandedWrap disabled
              case LVN_ENDLABELEDIT:
              {
                if((lpLvdi->item.iItem != -1) &&
                   (lpLvdi->item.pszText != NULL))
                   lstrcpy(lpAppinfo->szAppName, lpLvdi->item.pszText);
                return 0L;
                break;
              }
              IEZ
              спасибо
              я єто тоже нашел только-что,
              но я воспользовался другим способом :D

              ExpandedWrap disabled
                CString str;
                CEdit * edit = pole01.GetEditControl();
                edit->GetWindowText(str);
                pole01.SetItemText(cursel,subcursel,str);
              Сообщение отредактировано: Sailos -
                Вообще почитай книгу: Том 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
                ЛИТЕРАТУРА
                  А как для CListCtrl с стилем LVS_REPORT и LVS_EDITLABELS запретить редактирование первой колонки, разрешив редактирование всех остальных?
                  Цитата
                  Перед началом редактирования имени элемента списка родительское окно получает извещение LVN_BEGINLABELEDIT. Если обработчик этого сообщения возвратит ненулевое значение, редактирование будет заблокировано. Таким образом можно запретить пользователю редактировать названия некоторых элементов списка.

                  Это не работает.
                    LVS_EDITLABELS предназначен только для редактирования 1й колонки
                    решение: убрать этот стиль, а на месте редактирования остальных итемов, создавать динамически дочерний Edit итд

                    там реализация редактируемого ListBox, для понимания должно подойти
                      Цитата
                      решение: убрать этот стиль, а на месте редактирования остальных итемов, создавать динамически дочерний Edit итд

                      Спасибо, это помогло. Второй день долблюсь - что только ни перепробовал - ничего не помогало. Помогло лишь отключение стиля LVS_EDITLABELS в обработчике LVN_BEGINLABELEDIT в случае, если HitTest показал, что кликнута первая колонка.
                      Остальные колонки при этом редактируются без проблем (при помощи временного Edit'а), включать для них специально LVS_EDITLABELS даже не потребовалось (а LVS_EDITLABELS у меня выставлен в визуальном редакторе List Control Properties - Styles - Edit labels).
                      Сообщение отредактировано: monday2000 -
                        На всякий случа приведу исходный код - вдруг кому ещё пригодится:
                        ExpandedWrap disabled
                          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;
                          }

                        Код вообще-то взят из некоего примера из Интернета (забыл линк), и мною модифицирован.
                        Очень важной является проверка
                        ExpandedWrap disabled
                          if (htest.flags & LVHT_ONITEMLABEL)
                        - без неё всё вообще будет неверно работать.
                        Ещё куски кода для понимания:
                        ExpandedWrap disabled
                          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);
                          }

                        ExpandedWrap disabled
                          /////////////////////////////////////////////////////////////////////////////
                          // 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()
                          };
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,2374 ]   [ 16 queries used ]   [ Generated: 18.04.25, 15:46 GMT ]