OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 105
Текст из файла (страница 105)
8.0, 0.0, 8.9, -0.5, 2.5); 81Ма(г!хнобе(6С МООЕСЧ1ЕЫ); 81Соаб1бепС!СУ(); ) 1пС еа1п(1пС агяс, сьаг "'агач) ( 81иС1п1С(аагас, агзч); 81и(1п110!зр1аунобе(6(ОТ 51Н6СЕ [ 6[ОТ 868 [ ОСОТ ОЕРТН); 81иС1п(СЫ!пбпи51се(299. 200); 81иг1п!Сы)пбоиРоз111оп(199. 190); 81иССгеатеьн пбои(агах[0!); 1пзС(); 81итноисерипс(р(сййестз); 81исйезпарееипс(геспаре); 81иСОззр1аурипс(б!Ер1ау); 81иСМа1пьооР(): гесигп 9: Упражнения ° Измените листинг 23.0, добавив вызовы 81ризниап1е() так, чтобы при выборе в стеке сохранялись составные имена.
Каково при этом будет содержимое буфера выбора? ° По умолчанию команда е10ерспйапйе () устанавливает отображение г-значений в диапазон [0.0, 1.0). Попробуйте изменить значения 810ерспйап8е() и посмотрите, как ваши модификации повлияют на г-значения, возвращаемые в массиве записей нажатий. Выбор 483 рекомендации по написанию программы, использующей механизм выбора 5сльшинство программ, позволяющих пользователю интерактивно редактировать кометрические объекты, предоставляют пользователю механизм для предварительного выбора групп элементов или отдельных элементов.
Для программ двухкерного рисования (например, текстовых редакторов, программ верстки и проекшрования электронных схем) может быть легче делать собственные вычисления зля выбора, чем обращаться к механизму Орепб(.. Часто нетрудно выявить конгуры, ограничивающие двухмерные объекты, и выстроить их в иерархическую пруктуру для ускорения доступа. Например, выбор в стиле Орепоь для про~рамы конструирования сверхбольших интегральных схем (У151), содержащих каллиопы прямоугольников, может оказаться относительно медленным.
Вместе стем учет информации об ограничивающих рамках, когда прямоугольники обычно выровнены относительно экрана, может чрезвычайно ускорить процесс зыбо)к в такой программе. Надо полагать, что и написать такой код тоже проще. другой пример. Поскольку нажатия регистрируются только для геометрических збъектов, вы можете захотеть создать собственный метод для выбора текста.
Установка текущей позиции растра — это геометрическая операция, но она эффективна только в отношении одиночной доступной для выбора точки, обычно по ней можно опознать только левый нижний угол текста. Если ваша программа-рехзктор требует манипулирования отдельными символами текстовой строки, незбходим другой механизм выбора. Вы можете рисовать небольшие прямоугольники вокруг каждого символа в режиме выбора, но вряд ли такая обработка текста проще, да и носит индивидуальный характер.
Если вы решите использовать механизм выбора Ореп01, организуйте вашу прорамму и ее структуры данных так, чтобы облегчить рисование соответствующих гпнсков объектов как в обычном режиме визуализации, так и в режиме выбора. 3 атом случае, когда пользователь выделяет что-либо мышью, вы можете испольювать те же структуры данных для операции выбора, с помощью которых вы отозражали элементы на экране. Также определитесь с тем, разрешить ли пользовагелю выбирать сложные объекты. Это можно сделать посредством выделения едкого бита каждому подобъекту при сохранении устанавливаемого в момент вызора объекта (такой путь, однако, требует от вас сканирования полного списка злементов для нахождения выделенных).
Вы можете посчитать это полезным для поддержания списка указателей на выбранные элементы в расчете на ускорение поиска. Возможно, это неплохая идея — выделение бита элементу, поскольку, когда вы рисуете полную картинку, вы можете захотеть отобразить выбранные элеяенты как-то иначе (например, другим цветом или в пределах рамки выделения). Наконец, примите во внимание интерфейс пользователя, которому можно разрешить: ю выбор элемента; е захват группы элементов; ° добавление элемента к вылелению; 484 Глава 13 ° Выбор и обратная связь ° добавление захваченной группы к текущему выделению; ° удаление элемента из числа выделенных; ° выбор одного элемента из группы перекрывающихся элементов. Типовое решение для программы двухмерного рисования может работать следующим образом; 1.
Выбор всегда делается позиционированием указателя мыши и щелчком ее левой кнопки. Поэтому далее под указателем (сцгвог) мы будем всегда понимать указатель мыши, а не курсор клавиатуры, например. А под обобщенной кнопкой будет скрываться левая кнопка мыши. 2. Щелчок на элементе выделяет его и снимает выделение с любого другого ранее выделенного элемента. Если указатель находится поверх множества элементов, выделяется наименьший. (В трех измерениях существует много стратегий устранения неоднозначности выбора.) 3. При нажатии кнопки вне области с элементами, последующем ее удержании во время перетаскивания указателя и отпускании выделяются все элементы, попавшие в образованный этой операцией прямоугольник.
Это действие мы назовем захвщлом (зтчеер зе!есйоп). Элементы вне захваченной области не выделяются. Здесь вам нужно определиться, считать ли элемент выбранным на основании только полного попадания его в область захвата, или для этого достаточно частичного перекрытия элементом области. Стратегия «полностью внутриь обычно работает лучше. 4. Если в момент щелчка на элементе удерживается клавиша 5В1 т Ц этот элемент добавляется в список выбранных. Если же этот элемент уже присутствует в списке, он, наоборот, удаляется из выделения. 5. Когда захват выполняется при нажатой клавише 5п111, элементы добавляются к текущему выделению.
6. В чрезвычайно загроможденной области часто тяжело сделать правильный захват. Когда кнопка идет вниз, курсор может быть наведен на некоторый элемент, что в нормальном режиме соответствует выбору элемента. Вы можете делать любые операции захвата, но обычно интерфейс пользователя интерпретирует нажатие кнопки на элементе совместно с движением мыши как операцию «выбор плюс перетаскивание».
Чтобы решить эту проблему, вы можете вынудить программу проводить захват при нажатии другой клавиши, скажем, клавиши А11. Тогда операция захвата будет сводиться к последовательности из нажатия клавиши А11,<b>Текст обрезан, так как является слишком большим</b>.