Назначение классу окна имени выполняется
Назначение классу окна имени выполняется путем замещения в производном от TWindow (или другого оконного класса OWL) функции GetClassName(). Эта функция в своем исходном варианте содержит строку
return "OwlWindow";
что и приводит к назначению всем классам одного и того же имени (здесь имеются в виду классы, производные от TWindow; функции GetClassName() других классов возвращают другие имена). Замещающая функция должна вернуть произвольное имя, назначенное программистом. В нашем примере функция GetClassName() замещается в классах Quest и Contents, так как только для этих классов предусмотрено изменение их характеристик: для класса Quest - формы курсора, а для класса Contents - стиля класса. То, что классы Windows для OWL-классов Plain и MyWindow будут при этом иметь одинаковые Windows-имена, не помешает нам предусмотреть для них различные таблицы отклика. Явное назначение классу имени требуется лишь в тех случаях, когда мы хотим изменить такие характеристики окна, как курсор, пиктограмму или цвет фона (впрочем, цвет фона можно задать не только для класса окон, но и для каждого конкретного окна данного класса, для чего предусмотрена функция SetBkgndColor()).
Для изменения характеристик классов Quest и Contents в них описываются замещающие функции GetWindowClass(). В классе Quest назначается нестандартный курсор; в классе Contents в стиле окна устанавливаются биты CS_VREDRAW и CS_HREDRAW, чтобы при изменении пользователем размеров или конфигурации всплывающих окон их содержимое, позиционируемое функцией DrawText() относительно границ окна, каждый раз перерисовывалось заново.
В конструкторах классов Plain и Quest для всех окон этих классов устанавливается стиль WS_VISIBLE | WS_CHILD. Окна с текстом, разумеется, не должны иметь ни рамки, ни заголовка. Для всплывающих же окон класса Contents предусмотрена толстая рамка, позволяющая изменять их размеры, а также строка заголовка с системным меню и кнопкой закрытия окна.
Существенным элементом всех трех классов порожденных окон являются (закрытые) члены-данные plainIndex, questIndex и contIndex, которые служат для идентификации конкретных окон каждого класса. Инициализация этих переменных включена в заголовки конструкторов и, следовательно, при образовании соответствующих объектов необходимо указывать конкретное значение этого параметра. Статические объекты классов Plain и Quest создаются в цикле (в функции MyWindow::EvCreate()), и при вызове их конструкторов в качестве второго параметра просто указывается переменная цикла i. Сложнее дело обстоит с объектами класса Contents, которые создаются в произвольном порядке динамически в функции отклика на щелчок мыши; может показаться, что требуемое значение переменной contIndex в этом случае неизвестно. Однако при щелчке по той или иной "вопросной" строке вызывается функция EvLButtonDown() именно для того объекта-строки, по которому щелкнули, и, таким образом, значение данного-члена questIndex, которое, естественно, известно в функции отклика, соответствует индексу этого объекта. В то же время, щелкнув по некоторой строке, мы хотим образовать объект класса Contents именно для этой строки. Поэтому инициализирующим значением для переменной contIndex может служить текущее значение переменной questIndex, что и отражено в фактических аргументах вызова конструктора Contents.
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий