Описание пользователя
Глава 3. Использование стандартных модулей автокомпиляции
§3.7. Краткий перечень вводимых в модель описаний и реакций на события
§3.7.9. Внешний вид блока
§3.7.9.4. Рисование блока
Это событие возникает у всех блоков, для которых в окне параметров установлено программное рисование, при перерисовке окна подсистемы, в котором эти блоки находятся. В реакции на него блок должен нарисовать свой внешний вид при помощи функций Windows API или специальных функций рисования RDS. Примеры моделей, реагирующих на это событие, приведены в §3.6.5.
Текст реакции на событие программного рисования блока вводится на вкладке «» левой панели редактора модели: раздел «», подраздел «». В классе блока для нее создается функция с именем rdsbcppDraw следующего вида:
// Drawing the block image in the scheme void rdsbcppBlockClass::rdsbcppDraw(RDS_PDRAWDATA DrawData) { … пользовательский текст реакции … }
Параметр функции DrawData – это указатель на структуру описания события RDS_DRAWDATA:
typedef struct {
HDC dc; // Контекст устройства рисования
BOOL CalcMode; // Текущий режим RDS
int BlockX, // Координаты точки привязки
BlockY; // блока в окне
double DoubleZoom; // Масштаб окна (в долях единицы)
BOOL RectValid; // Флаг изменения размеров блока
int Left,Top; // Верхний левый угол блока
int Width,Height; // Ширина и высота блока
RECT *VisibleRect; // Видимая в окне часть рабочего поля
BOOL FullDraw; // Необходимо перерисовать весь блок
} RDS_DRAWDATA;
typedef RDS_DRAWDATA *RDS_PDRAWDATA;
Поля структуры имеют следующий смысл:
- dc (HDC)
- Контекст устройства Windows (device context), на котором модель рисует изображение. Этот параметр используется только в графических функциях Windows API, в графических функциях RDS его указывать не нужно.
- CalcMode (BOOL)
- TRUE, если RDS находится в режимах моделирования или расчета, и FALSE, если RDS находится в режиме редактирования (в режиме редактирования сложные блоки часто рисуют в наиболее общей их форме и со всеми включенными дополнительными элементами, если эти элементы могут исчезать в процессе расчета).
- BlockX, BlockY (int)
- Координаты верхнего левого угла изображения блока в текущем масштабе окна его подсистемы. В этих координатах уже учтена возможная связь положения блока с его переменными, которая может быть задана в окне параметров на панели «».
- DoubleZoom (double)
- Текущий масштаб окна родительской подсистемы блока в долях единицы: 1 – 100%, 0.5 – 50%, 2 – 200% и т.п. Если какие-то внутренние элементы программно рисуемого изображения блока (например, шрифт надписи) должны масштабироваться вместе с ним, при рисовании размеры этих элементов необходимо умножать на значение этого поля.
- RectValid (BOOL)
- Признак изменения размеров прямоугольника блока. Если в результате рисования модель изменяет размер блока (например, если его высота или ширина отражают его внутреннее состояние), в это поле необходимо записать значение TRUE и занести в следующие четыре целых поля (Left, Top, Width и Height) новые координаты и размеры блока. В автокомпилируемых блоках эта возможность используется крайне редко.
- Left, Top, Width, Height (int)
- Координаты левого верхнего угла (Left, Top) прямоугольной области, занимаемой блоком, ее ширина (Width) и высота (Height) в текущем масштабе с учетом возможной связи положения блока с его переменными. Эти значения можно непосредственно использовать в функциях рисования. В эти же поля модель может записать новые координаты и размеры блока, если, по какой-либо причине, она решит изменить их при рисовании (при этом также необходимо записать TRUE в поле RectValid).
- VisibleRect (RECT*)
- Указатель на структуру RECT Windows API, в которой записаны координаты видимой в данный момент в окне части рабочего поля подсистемы. Модель может использовать их для того, чтобы уменьшить потери времени на обновление окна, не рисуя части блока, не попавшие в видимую в данный момент область. Делать это не обязательно – рисование за пределами видимой в окне области отсекается автоматически.
- FullDraw (BOOL)
- Логическое поле, указывающее на необходимость полной перерисовки всего изображения блока (TRUE) или только тех его частей, которые изменились с момента последнего рисования (FALSE). Его использование позволяет снизить потери времени на обновление окна, не рисуя не изменившиеся части изображения блока без необходимости. В автокомпилируемых блоках эта возможность используется крайне редко, подробно она рассматривается в §2.10.2 руководства программиста.
При написании моделей блоков без использования модуля автокомпиляции рисованию блока соответствует константа RDS RDS_BFM_DRAW.