Описание пользователя
Глава 3. Использование стандартных модулей автокомпиляции
§3.7. Краткий перечень вводимых в модель описаний и реакций на события
§3.7.9. Внешний вид блока
Рассматриваются реакции на события, связанные с изменением размеров и положения блока, а также с программным рисованием его изображения в подсистеме.
§3.7.9.1. Размер блока изменен
Это событие возникает в блоке, который программно рисует свое изображение, а также у блоков, изображаемых прямоугольником с текстом, после того, как пользователь тем или иным способом изменил размер блока. В реакции на него можно определить и запомнить размеры каких-либо внутренних элементов изображения блока, вычисляемые относительно его текущего размера, или скорректировать изменения размера, сделанные пользователем, если они не подходят для блока. Например, можно не разрешать пользователю сделать квадратный блок прямоугольным, принудительно устанавливая одинаковую ширину и высоту. От способа изменения размера возникновение события не зависит: оно возникает и после перетаскивания маркеров выделения блока, и после ввода точных значений размера с клавиатуры при нажатии кнопки «» в окне параметров блока.
Текст реакции на это событие вводится на вкладке «» левой панели редактора модели: раздел «», подраздел «». В классе блока для нее создается функция с именем rdsbcppBlockResized следующего вида:
// Block size has changed
void rdsbcppBlockClass::rdsbcppBlockResized(
RDS_PRESIZEDATA ResizeData,int &Result)
{
… пользовательский текст реакции …
}
У функции два параметра. Параметр ResizeData – это указатель на структуру описания события RDS_RESIZEDATA:
typedef struct {
BOOL HorzResize; // Изменение горизонтального размера
BOOL VertResize; // Изменение вертикального размера
int newWidth,newHeight; // Новые значения ширины и высоты
int GridDx,GridDy; // Шаги сетки редактора
BOOL SnapToGrid; // Привязка к сетке
} RDS_RESIZEDATA;
typedef RDS_RESIZEDATA *RDS_PRESIZEDATA;}
Поля структуры имеют следующий смысл:
- HorzResize, VertResize (BOOL)
- Логические значения, указывающие на то, каким именно образом пользователь изменил размеры блока:
HorzResize VertResize Действия пользователя FALSE FALSE Новые размеры блока заданы числами в окне параметров. FALSE TRUE Пользователь перетащил верхнюю или нижнюю метку масштабирования вверх или вниз (изменена только высота). TRUE FALSE Пользователь перетащил левую или правую метку масштабирования влево или вправо (изменена только ширина). TRUE TRUE Пользователь перетащил одну из угловых меток масштабирования (изменены и ширина, и высота). - newWidth, newHeight (int)
- Новые значения ширины и высоты блока соответственно для масштаба 100%. Модель может вмешаться в изменение размеров, заменив значения в этих полях. Например, можно записать вместо newHeight старое значение высоты блока, тогда изменение высоты, сделанное пользователем, будет проигнорировано. Внутри этой реакции прежние значения ширины и высоты блока можно получить при помощи сервисной функции rdsGetBlockDimensionsEx.
- GridDx, GridDy (int)
- Горизонтальный и вертикальный шаги сетки окна родительской подсистемы блока соответственно.
- SnapToGrid (BOOL)
- TRUE, если в окне родительской подсистемы блока включена привязка к сетке, и FALSE в противном случае.
Второй параметр функции реакции – это ссылка на целую переменную Result. Через этот параметр модель может сообщить RDS, следует ли принимать сделанное пользователем изменение размера. Для этого параметру Result нужно присвоить одну из двух стандартных констант:
- RDS_BFR_DONE – изменение размеров разрешено: блок получит размеры, записанные в полях newWidth и newHeight переданной через параметр ResizeData структуры (при этом в реакции на событие можно изменить эти поля, чтобы скорректировать размеры блока).
- RDS_BFR_STOP – изменение размеров отменено, ширина и высота блока останутся неизменными.
При написании моделей блоков без использования модуля автокомпиляции событию изменения размера блока соответствует константа RDS RDS_BFM_RESIZE.