C++ Builder::Resize. Часть 2

В перовой части этого цикла мы добились того, что вокруг некоторого визуального компонента отрисовываются восемь маркеров. Но ни изменения размеров ни перетаскивания мы не обеспечили.

Перетаскивание объекта

Сделаем сначала возможность перетаскивание компонента. Как было оговорено ранее, это будет реализовано в классе TResize. Перетаскивание объекта можно реализовать самым простым способом – переопределением некоторых событий мыши (Down, Move и Up). Но тут возникает проблема, так как сам компонент, с которым мы работает, объявлен типа TControl, а события мыши у него закрыты (в protected).

Эту проблему можно решить привидением к типу, лежащему ниже в иерархии классов, но этот будет довольно сложно реализовать, так как придется определять, является ли компонент TGraphicControl или TWinControl. Поэтому проще самому ввести класс, наследника TControl, в котором открыть события мыши. Назовем его TWinCntrl, и уже к нему будет приводить наш компонент.

  1. class TWinCtrl : public TWinControl {
  2. __published:
  3.     __property OnMouseMove;
  4.     __property OnMouseUp;
  5.     __property OnMouseDown;
  6. };

Для реализации перетаскивания компонента сначала добавим следующие private поля:
    FDrag : bool – флаг, обозначающий перетаскивают ли сейчас объект.
    FOldTop, FOldTop: int – положение курсора на объекте до начала перетаскивания.

  1. bool FDrag;
  2. int FOldTop;
  3. int FOldLeft;

Так же добавим в качестве методов в класс TResize, обработчики событий мыши:

  1. void __fastcall MouseDown( TObject *Sender, TMouseButton Button,
  2.     TShiftState Shift, int X, int Y );
  3. void __fastcall MouseMove( TObject *Sender, TShiftState Shift, int X,
  4.     int Y );
  5. void __fastcall MouseUp( TObject *Sender, TMouseButton Button,
  6.     TShiftState Shift, int X, int Y );

И в конечном итоге, объявление класса будет выглядеть так:... читать дальше

builder, cpp

C++ Builder::Resize. Часть 1

В этом цикле статей будет разработана определенная «библиотека», позволяющая изменять размеры визуальных компонентов Builder во время работы программы. То есть вокруг компонента отрисовываются  8 маркеров, которые можно перетаскивать и вслед за ними будет меняться размер самого компонента. Подобное можно увидеть почти в любом WYSIWYG редакторе, в той же Delphi или Builder'e и т.п.

 

Рассмотрим основные требования:

  • Отрисовка восьми маркеров, перетаскивая которые будет изменяться размер компонента.
  • Возможность перетаскивать сам компонент.
  • Не зависимость от конкретного типа компонента, главное, что бы был наследником TControl.
  • Легкость встраивания в основную программу.

Для начала создадим в Builder'e новый VCL проект, и добавить новый unit. Назвать его можно, к примеру, Resize. В нем и будет писать весь дальнейший код.

Проектирование классов

Нам понадобиться всего два класса. Первый это класс, описывающий маркер, второй, это сам класс, отвечающий за изменение размера и контроль над компонентом. Назовем их TMarker и TResize соответственно.... читать дальше

builder, cpp