Визуальное редактирование данных
Определение индекса вершины, к которой достаточно близко подобрался указатель мыши, производится в методе FindPoint класса документа. В случае если степень близости недостаточна, функция возвращает значение -1. Вставьте этот метод в файл реализации класса (TreeDoc.cpp):
int CTreeDoc::FindPoint(CDPointS pt) { // ====== Пессимистический прогноз int id = -1; //====== Поиск среди точек дежуоного полигона for (UINT 1=0; i<m_Poly.m_Points.size(); i++) { //=== Степень близости в World-пространстве. //=== Здесь мы используем операцию взятия нормы //=== вектора, которую определили в классе CDPoint if (!(m_Poly.m_Points[i) -pt) <= 5e-2) ( id = i; break; // Нашли } } //====== Возвращаем результат return id; }
В этот момент вы можете запустить приложение, выбрать шаблон Draw и проверить возможности визуального редактирования, перетаскивая вершины звезды в пределах клиентской области окна документа.
Включение или выключение второго режима редактирования, служащего для создания нового полигона и ввода координат вершин с помощью мыши, потребует меньше усилий, так как логика самого режима уже реализована в обработчике нажатия левой кнопки мыши. Для включения или выключения (toggle) второго режима используется одна и та же команда. Создайте обработчик команды Edit › New Poly. Для этого:
- Поставьте фокус на элемент CDrawView в представлении классов (Class View) и перейдите в окно Properties.
- Нажав кнопку Events, выберите идентификатор ID_EDIT_NEWPOLY, раскройте маркер (+) и выберите COMMAND (первую из двух выпавших строк).
- Создайте обработчик, выбрав <Add> в выпадающем списке справа от COMMAND.
В теле обработчика следует установить флаги состояния, уничтожить все вершины дежурного полигона и перерисовать представление:
void CDrawView::OnEditNewpoly (void) { //====== Включаем/Выключаем режим ввода вершин m_bNewPoints =!m_bNewPoints; //=== Снимаем флаги редактирования перетаскиванием m_bReady = false; m_bLock = false; //====== Если режим включен, то уничтожаем вершины if (m_bNewPoints) { GetDocument() › m_Poly.m_Points.clear(); Invalidate(); } }