Текущий раздел:

Описания RDS

Описание пользователя

Глава 3. Использование стандартных модулей автокомпиляции

§3.7. Краткий перечень вводимых в модель описаний и реакций на события

§3.7.9. Внешний вид блока

§3.7.9.4. Рисование блока

# Описание пользователя

## Глава 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.