Элемент управления типа Дерево.
От: Settler  
Дата: 14.06.04 14:06
Оценка:
Как в элементе управления типа Дерево текст выделять разными цветами? Функция SetTextColor работает для всего Дерева. А мне нужно, чтобы разные строки имели разные цвета. Функция SetLineColor вообще отказывается работать. Компилятор выдаёт ошибку: error C2039: 'SetLineColor' : is not a member of 'CTreeCtrl'.


14.06.04 18:15: Перенесено модератором из 'C/C++'. korzhik (5) в MFC Settler (0) в MFC — Павел Кузнецов
Re: Элемент управления типа Дерево.
От: Settler  
Дата: 14.06.04 14:18
Оценка:
И ещё парачка вопросов.
1) Как убрать сортировку?
2) Можно ли перемещать уже созданные элементы по дереву? Как?
Re[2]: Элемент управления типа Дерево.
От: Denis Titov Россия  
Дата: 15.06.04 02:53
Оценка:
Здравствуйте, Settler, Вы писали:

S>И ещё парачка вопросов.

S>1) Как убрать сортировку?
S>2) Можно ли перемещать уже созданные элементы по дереву? Как?

Чтобы текст рисовать разными цветами, придется отрисовывать контрол самому через механизм CustomDraw.

В MSDN есть статейка на эту тему.

Что касается сортировки, можно посмотреть как это Дельфи делает, у дельфяного контрола есть своство SortType — посмотри как оно реализовано.

А что значит "перемещать уже созданные элементы"? Мышью таскать?
Re[3]: Элемент управления типа Дерево.
От: Settler  
Дата: 15.06.04 07:52
Оценка:
Здравствуйте, Denis Titov, Вы писали:

DT>А что значит "перемещать уже созданные элементы"? Мышью таскать?


Ну не обязательно мышью. Можно кнопки сделать, чтоб при нажатии запись поднималась выше или опускалась ниже. На сколько я понимаю, это возможно только при отключенной сортировки. А отключение сортировки в стандартных опциях я не нашёл.
Re[4]: Элемент управления типа Дерево.
От: Denis Titov Россия  
Дата: 15.06.04 08:05
Оценка:
S>Ну не обязательно мышью. Можно кнопки сделать, чтоб при нажатии запись поднималась выше или опускалась ниже. На сколько я понимаю, это возможно только при отключенной сортировки. А отключение сортировки в стандартных опциях я не нашёл.

Честно говоря, не совсем понимаю в чем затруднение. Просто в одном месте удаляешь узел — в другом создаешь, вот он и переместился.
Re[5]: Элемент управления типа Дерево.
От: Settler  
Дата: 15.06.04 08:33
Оценка:
DT>Честно говоря, не совсем понимаю в чем затруднение. Просто в одном месте удаляешь узел — в другом создаешь, вот он и переместился.

Точно =). Сказываются 4 дня проведённые за компом.

Возникла ещё проблемка. У дерева есть такая опция EditLabel. Если включить, то можно редактировать элементы прямо в дереве. Но при нажатии на Enter закрывается диалоговое окно. Это понятно, т.к. фокус стоит всё время на кнопе Ok. И при нажатии вызывается функция OnOk. Как мне убрать фокус с кнопки Ok и поставить на дерево, чтобы изменить запись? И нужно ли дополнительно что либо прописывать, чтобы изменить запись?
Re[3]: Элемент управления типа Дерево.
От: Settler  
Дата: 15.06.04 09:00
Оценка:
DT>Чтобы текст рисовать разными цветами, придется отрисовывать контрол самому через механизм CustomDraw.

DT>В MSDN есть статейка на эту тему.


А можно маленький примерчик?

Я так понял, что мне нужна NMTVCUSTOMDRAW Structure. Там есть переменная NMCUSTOMDRAW nmcd. Это ещё одна структура. В ней ещё куча параметров и NMHDR hdr — ещё структура... Мне придётся заполнять все структуры? И как это всё мне привезать к InsertItem?

Я делаю вот так:
CTreeCtrl* pCtrl=(CTreeCtrl*) GetDlgItem(IDC_TREE1);
pCtrl->InsertItem(Тут уже в зависимости от ситуации вставляю либо адрес структуры TVINSERTSTRUCT либо элемент HTREEITEM)
Re[6]: Элемент управления типа Дерево.
От: SWW Россия  
Дата: 15.06.04 09:16
Оценка:
S> Но при нажатии на Enter закрывается диалоговое окно. Это понятно, т.к. фокус стоит всё время на кнопе Ok.

Вовсе не поэтому. Даже если фокус будет на другом контроле — все равно вызовется OnOK. Нужно в его обработчике анализировать edit и если он активен, то не выходить.
Re[7]: Элемент управления типа Дерево.
От: Settler  
Дата: 15.06.04 09:49
Оценка:
Здравствуйте, SWW, Вы писали:

SWW>Вовсе не поэтому. Даже если фокус будет на другом контроле — все равно вызовется OnOK. Нужно в его обработчике анализировать edit и если он активен, то не выходить.


Значит какой то код всё таки надо дописывать, раз надо анализировать edit. У меня в кинжке даже написано какой и где, но книга написана для Visual C++ 6.0. А я сейчас пользуюсь Visual Studio .NET 2003.

В книге написано, что нужно перегрузить виртуальную функцию OnNotify. Но я так и не понял как этого сделать в VS.NET. Как добавить стандартную функцию? Причём в окне Messages класса CMyView нету WM_NOTIFY. Так как это сделать?
Re[8]: Элемент управления типа Дерево.
От: night  
Дата: 15.06.04 11:37
Оценка:
Здравствуйте, Settler, Вы писали:

S>В книге написано, что нужно перегрузить виртуальную функцию OnNotify. Но я так и не понял как этого сделать в VS.NET. Как добавить стандартную функцию? Причём в окне Messages класса CMyView нету WM_NOTIFY. Так как это сделать?


посмотри в MSDN

Knowledge Base
KB167960
BUG: ESC/ENTER Keys Do Not Work When Editing CTreeCtrl Labels

Re[9]: Элемент управления типа Дерево.
От: Settler  
Дата: 15.06.04 13:42
Оценка:
Здравствуйте, night, Вы писали:
N>посмотри в MSDN

N>

N>Knowledge Base
N>KB167960
N>BUG: ESC/ENTER Keys Do Not Work When Editing CTreeCtrl Labels


Спасибо. Но теперь есть другая проблемка...
BOOL CMyXxx::PreTranslateMessage(MSG* pMsg)
   {
      // If edit control is visible in tree view control, when you send a
      // WM_KEYDOWN message to the edit control it will dismiss the edit
      // control. When the ENTER key was sent to the edit control, the
      // parent window of the tree view control is responsible for updating
      // the item's label in TVN_ENDLABELEDIT notification code.
      if (pMsg->message == WM_KEYDOWN &&
         pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)
      {
         CEdit* edit = m_TreeCtrl.GetEditControl();
         if (edit)
         {
            edit->SendMessage(WM_KEYDOWN, pMsg->wParam, pMsg->lParam);
            return TRUE;
         }
      }
      // CXxxx can be a CFormView, Cdialog, or CPropertyPage class.
      return CXxxx::PreTranslateMessage(pMsg);
   }


Вот код, предложенного там примера. Он работает. Если я в дереве редактирую запись и при этом нажму Enter или Esc то он не закроет диалоговое окно. Но и текст в дереве не изменится.
Объясните, что делает SendMessage.

И на сколько я понял, вот в этот if

         if (edit)
         {
            edit->SendMessage(WM_KEYDOWN, pMsg->wParam, pMsg->lParam);
            return TRUE;
         }

надо добавить код, который бы добавил текст в моё дерево. Но я не заню где в данный момент этот текст находится...
Re[10]: Элемент управления типа Дерево.
От: night  
Дата: 15.06.04 13:47
Оценка:
Здравствуйте, Settler, Вы писали:

S>Вот код, предложенного там примера. Он работает. Если я в дереве редактирую запись и при этом нажму Enter или Esc то он не закроет диалоговое окно. Но и текст в дереве не изменится.


у меня в коде так

    if( pMsg->message == WM_KEYDOWN )
    {
        // When an item is being edited make sure the edit control
        // receives certain important key strokes
        if( GetTreeCtrl().GetEditControl() 
            && (pMsg->wParam == VK_RETURN 
            || pMsg->wParam == VK_DELETE 
            || pMsg->wParam == VK_ESCAPE
            || GetKeyState( VK_CONTROL) 
            )
            )
        {
            ::TranslateMessage(pMsg);
            ::DispatchMessage(pMsg);
            return TRUE;
        }


PS правда это не на диалоге
Re[11]: Элемент управления типа Дерево.
От: Settler  
Дата: 15.06.04 14:13
Оценка:
Здравствуйте, night, Вы писали:

N>Здравствуйте, Settler, Вы писали:


S>>Вот код, предложенного там примера. Он работает. Если я в дереве редактирую запись и при этом нажму Enter или Esc то он не закроет диалоговое окно. Но и текст в дереве не изменится.


N>у меня в коде так


Хм... Всё равно не работает. Но я кое что поменял...

CTreeCtrl* m_TreeCtrl=(CTreeCtrl*) GetDlgItem(IDC_TREE1);
if( pMsg->message == WM_KEYDOWN )
    {
        // When an item is being edited make sure the edit control
        // receives certain important key strokes
        //if( GetTreeCtrl().GetEditControl() 
        if( m_TreeCtrl->GetEditControl() 
            && (pMsg->wParam == VK_RETURN 
            || pMsg->wParam == VK_DELETE 
            || pMsg->wParam == VK_ESCAPE
            || GetKeyState( VK_CONTROL) 
            )
            )
        {
            ::TranslateMessage(pMsg);
            ::DispatchMessage(pMsg);
            return TRUE;
        }
    }


Может я не правильно определил функцию PreTranslateMessage(MSG* pMsg)?
Определял и описывал в h файле вручную. Описана она в классе производном от CDialog... Хотя в отладчике видно как программа входт в функцию...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.