Главная » C++, C++ Builder » Объединяя все вместе: Scribble версии 2

0

Как вы помните, в главе 2 мы написали программу Scribble (каракули), которая являются учебной программой в Visual C++ и занимает добрую сотню страниц кода. Если не помните, ничего страшного в этом нет. Характерные моменты мы разберем в данном примере.

Программа Scribble позволяет рисовать на форме с помощью мыши. Нажав левую кнопку, вы начинаете процесс рисования, так что можно, удерживая левую  кнопку  нажатой,  перемещать мышь по форме, оставляя за собой след. Когда мы оставили программу Scribble, в ней была куча проблем. Первой серьезной проблемой являлось ограничение (связанное с дизайном программы) в 100 точек, участвующих в процессе рисования. Хотя это число можно поменять, но все равно программа останется привязанной к конкретному  ограниченному  числу  точек. Мы собираемся решить эту проблему, используя класс STL vector вместо обычного статического массива точек.

Вторая проблема в программе Scribble не так заметна, но тем не менее она есть. Когда вы рисуете линию в Scribble и отпускаете кнопку мыши, программа перестает следить за перемещением курсора. Если вы еще раз нажмете кнопку, то у вас получится отдельный кусок изображения. Все это здорово, однако проблема проявляется, когда мы перерисовываем форму (в процедуре paint). Если, например, вы нарисовали несколько линий, а затем свернули и вновь раскрыли форму, то отобразится только последняя линия. Это происходит из-за  того, что мы останавливаем запись координат, когда отпускается кнопка мыши, и запускаем запись по новой (с начала), когда кнопка нажимается. В данном примере мы исправим Scribble раз и навсегда, так что все будет работать правильно.

ЗАМЕЧАНИЕ

Полный исходный код данного примера находится на прилагаемом компакт-диске в каталоге Chapter5\ScribbleSTL. Если хотите, можете не набирать код, а просто скопировать его с компакт- диска.

Вместо того, чтобы все перестроить в дизайне проекта, мы будем исправлять старый проект, добавляя вещи, которые нам нужны. Если вам интересно, как это все было построено изначально, просмотрите главу 2.

Первый шаг — заменить существующие массивы точек на массив типа vector, содержащий точки. Нам также хотелось бы изменить процесс, чтобы запоминать перемещения мыши, а также момент, когда отпускается кнопка мыши, так что мы собираемся хранить информацию в объекте. Этот новый класс C++ будет  содержать координаты  X и Y всех точек, а также флаг, указывающий, было ли это простым перемещением или рисованием линии. Режим move  будет  означать,  что кнопка мыши отпущена в данный момент, а режим draw — что кнопка нажата.

Для этого нам нужно сделать несколько вещей. Во-первых, нужно определить новый класс, содержащий описанную выше информацию. Во-вторых, нам нужно изменить класс родительского окна MDI, чтобы можно было использовать наш новый класс в массиве (vector) из библиотеки STL и получать из этого массива необходимую информацию.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии