Как в элементе управления типа Дерево текст выделять разными цветами? Функция SetTextColor работает для всего Дерева. А мне нужно, чтобы разные строки имели разные цвета. Функция SetLineColor вообще отказывается работать. Компилятор выдаёт ошибку: error C2039: 'SetLineColor' : is not a member of 'CTreeCtrl'.
14.06.04 18:15: Перенесено модератором из 'C/C++'. korzhik (5) в MFC Settler (0) в MFC — Павел Кузнецов
Здравствуйте, Settler, Вы писали:
S>И ещё парачка вопросов. S>1) Как убрать сортировку? S>2) Можно ли перемещать уже созданные элементы по дереву? Как?
Чтобы текст рисовать разными цветами, придется отрисовывать контрол самому через механизм CustomDraw.
Здравствуйте, Denis Titov, Вы писали:
DT>А что значит "перемещать уже созданные элементы"? Мышью таскать?
Ну не обязательно мышью. Можно кнопки сделать, чтоб при нажатии запись поднималась выше или опускалась ниже. На сколько я понимаю, это возможно только при отключенной сортировки. А отключение сортировки в стандартных опциях я не нашёл.
S>Ну не обязательно мышью. Можно кнопки сделать, чтоб при нажатии запись поднималась выше или опускалась ниже. На сколько я понимаю, это возможно только при отключенной сортировки. А отключение сортировки в стандартных опциях я не нашёл.
Честно говоря, не совсем понимаю в чем затруднение. Просто в одном месте удаляешь узел — в другом создаешь, вот он и переместился.
DT>Честно говоря, не совсем понимаю в чем затруднение. Просто в одном месте удаляешь узел — в другом создаешь, вот он и переместился.
Точно =). Сказываются 4 дня проведённые за компом.
Возникла ещё проблемка. У дерева есть такая опция EditLabel. Если включить, то можно редактировать элементы прямо в дереве. Но при нажатии на Enter закрывается диалоговое окно. Это понятно, т.к. фокус стоит всё время на кнопе Ok. И при нажатии вызывается функция OnOk. Как мне убрать фокус с кнопки Ok и поставить на дерево, чтобы изменить запись? И нужно ли дополнительно что либо прописывать, чтобы изменить запись?
DT>Чтобы текст рисовать разными цветами, придется отрисовывать контрол самому через механизм CustomDraw.
DT>В MSDN есть статейка на эту тему.
А можно маленький примерчик?
Я так понял, что мне нужна NMTVCUSTOMDRAW Structure. Там есть переменная NMCUSTOMDRAW nmcd. Это ещё одна структура. В ней ещё куча параметров и NMHDR hdr — ещё структура... Мне придётся заполнять все структуры? И как это всё мне привезать к InsertItem?
Я делаю вот так:
CTreeCtrl* pCtrl=(CTreeCtrl*) GetDlgItem(IDC_TREE1);
pCtrl->InsertItem(Тут уже в зависимости от ситуации вставляю либо адрес структуры TVINSERTSTRUCT либо элемент HTREEITEM)
S> Но при нажатии на Enter закрывается диалоговое окно. Это понятно, т.к. фокус стоит всё время на кнопе Ok.
Вовсе не поэтому. Даже если фокус будет на другом контроле — все равно вызовется OnOK. Нужно в его обработчике анализировать edit и если он активен, то не выходить.
Здравствуйте, SWW, Вы писали:
SWW>Вовсе не поэтому. Даже если фокус будет на другом контроле — все равно вызовется OnOK. Нужно в его обработчике анализировать edit и если он активен, то не выходить.
Значит какой то код всё таки надо дописывать, раз надо анализировать edit. У меня в кинжке даже написано какой и где, но книга написана для Visual C++ 6.0. А я сейчас пользуюсь Visual Studio .NET 2003.
В книге написано, что нужно перегрузить виртуальную функцию OnNotify. Но я так и не понял как этого сделать в VS.NET. Как добавить стандартную функцию? Причём в окне Messages класса CMyView нету WM_NOTIFY. Так как это сделать?
Здравствуйте, Settler, Вы писали:
S>В книге написано, что нужно перегрузить виртуальную функцию OnNotify. Но я так и не понял как этого сделать в VS.NET. Как добавить стандартную функцию? Причём в окне Messages класса CMyView нету WM_NOTIFY. Так как это сделать?
посмотри в MSDN
Knowledge Base
KB167960
BUG: ESC/ENTER Keys Do Not Work When Editing CTreeCtrl Labels
Здравствуйте, 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;
}
надо добавить код, который бы добавил текст в моё дерево. Но я не заню где в данный момент этот текст находится...
Здравствуйте, Settler, Вы писали:
S>Вот код, предложенного там примера. Он работает. Если я в дереве редактирую запись и при этом нажму Enter или Esc то он не закроет диалоговое окно. Но и текст в дереве не изменится.
у меня в коде так
if( pMsg->message == WM_KEYDOWN )
{
// When an item is being edited make sure the edit control
// receives certain important key strokesif( GetTreeCtrl().GetEditControl()
&& (pMsg->wParam == VK_RETURN
|| pMsg->wParam == VK_DELETE
|| pMsg->wParam == VK_ESCAPE
|| GetKeyState( VK_CONTROL)
)
)
{
::TranslateMessage(pMsg);
::DispatchMessage(pMsg);
return TRUE;
}
Здравствуйте, 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... Хотя в отладчике видно как программа входт в функцию...