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

Описания RDS

Приложения

Приложение А. Функции, константы и структуры RDS

А.2. События блока и связанные с ними описания

А.2.6. События пользовательского интерфейса и рисования внешнего вида блоков

А.2.6.3. RDS_BFM_DRAW – рисование внешнего вида блока

# Приложения

## Приложение А. Функции, константы и структуры RDS

### А.2. События блока и связанные с ними описания

#### А.2.6. События пользовательского интерфейса и рисования внешнего вида блоков

##### А.2.6.3. RDS_BFM_DRAW – рисование внешнего вида блока

Поток, в котором вызывается функция модели

Главный поток RDS.

Первый параметр функции модели (int CallMode)

Константа RDS_BFM_DRAW.

Третий параметр функции модели (void *ExtParam)

Указатель на структуру описания события RDS_DRAWDATA.

Возвращаемое функцией модели значение

RDS_BFR_DONE | Рисование выполнено.
RDS_BFR_REDRAW | Необходимо повторно вызвать событие после рисования всех остальных блоков.

Примечания

Реакция на событие RDS_BFM_DRAW вызывается для блока, модель которого рисует внешний вид блока программно, в момент обновления окна подсистемы, в которой находится этот блок. Для включения программного рисования в окне параметров блока должен быть установлен флаг «внешний вид блока – определяется функцией DLL», в противном случае блок будет изображаться либо векторной картинкой, либо прямоугольником с текстом, и реакция RDS_BFM_DRAW не будет вызвана. В ответ на вызов модель должна нарисовать в окне подсистемы изображение, используя для этого сервисные функции RDS или графические функции API Windows (программное рисование внешнего вида блоков подробно рассмотрено в §2.10 руководства программиста). В третьем параметре функции модели при этом передается указатель на структуру RDS_DRAWDATA, содержащую оконные координаты, по которым необходимо нарисовать изображение, а также другие необходимые для рисования параметры:

      typedef struct {
        HDC dc;                 // Контекст устройства рисования
        BOOL CalcMode;          // Текущий режим RDS
        RDSINT32 BlockX,BlockY; // Координаты точки привязки
                                // блока в окне
        double DoubleZoom;      // Масштаб окна (в долях единицы)
        BOOL RectValid;         // Флаг изменения размеров блока
        RDSINT32 Left,Top;      // Верхний левый угол блока
        RDSINT32 Width,Height;  // Ширина и высота блока
        RECT *VisibleRect;      // Видимая в окне часть рабочего поля
        BOOL FullDraw;          // Необходимо перерисовать весь блок
      } RDS_DRAWDATA;
      typedef RDS_DRAWDATA *RDS_PDRAWDATA;

Поля структуры

dc(HDC)
  Контекст устройства Windows (device context, HDC), на котором функция модели должна нарисовать изображение. Его можно использовать в вызовах графических функций Windows API: Rectangle, LineTo, TextOut и т.п. Если для рисования используются сервисные функции RDS, контекст устройства указывать не нужно.
CalcMode(BOOL)
  Текущий режим RDS: TRUE для режимов моделирования и расчета и FALSE для режима редактирования. В режимах моделирования и расчета на изображении блока, как правило, отражаются текущие значения переменных этого блока – если переменные не влияют на его внешний вид, в программном рисовании, чаще всего, нет необходимости.
BlockX, BlockY(RDSINT32)
  Координаты точки привязки блока в окне (в данном случае, для программно рисуемых блоков, это левый верхний угол изображения) с учетом возможной связи положения блока с его статическими переменными. В этих координатах уже учтен текущий масштаб окна, то есть их можно использовать непосредственно в графических функциях. Горизонтальная ось координат направлена вправо, вертикальная – вниз, начало координат – левый верхний угол рабочего поля.
DoubleZoom(double)
  Текущий масштаб окна в долях единицы: 1 для 100%, 2 для 200%, 0.5 для 50% и т.п.
RectValid(BOOL)
  Логический флаг изменения размеров прямоугольника блока. Перед вызовом реакции RDS записывает в это поле значение FALSE и заполняет следующие четыре поля структуры (Left, Top, Width и Height) согласно положению блока в окне, значениям его переменных, если положение с ними связано, и масштабу окна. Если по каким-либо причинам модель блока не устраивает вычисленный таким образом размер (например, если реальный размер блока как-то связан с его состоянием, и по результатам вычислений при рисовании он не совпал с размером, исходно определенным RDS), модель может записать в поле RectValid значение TRUE и заменить значения полей Left, Top, Width и Height на новые, вычисленные при рисовании. В этом случае RDS запомнит новый, вычисленный моделью, размер блока и будет использовать его для определения попадания курсора мыши в изображение этого блока вплоть до следующего рисования.
Left, Top(RDSINT32)
  Левый верхний угол (Left – горизонтальная координата, Top – вертикальная) прямоугольной области, занимаемой блоком в окне в текущем масштабе, с учетом возможной связи положения блока с переменными. Эти значения можно непосредственно использовать в функциях рисования. В этих же полях модель может вернуть новое, вычисленное при рисовании, положение левого верхнего угла блока, если присвоит полю RectValid значение TRUE.
Width, Height(RDSINT32)
  Ширина (Width) и высота (Height) прямоугольной области, занимаемой блоком в окне в текущем масштабе, с учетом возможной связи размеров блока с переменными. Эти значения можно непосредственно использовать в функциях рисования. В этих же полях модель может вернуть новые, вычисленные при рисовании, размеры блока, если присвоит полю RectValid значение TRUE.
VisibleRect(RECT*)
  Указатель на структуру типа RECT (стандартный тип, используемый в Windows API для описания прямоугольника), в которой находятся координаты видимой в данный момент в окне части рабочего поля подсистемы. Ориентируясь на размеры этой области, модель может уменьшить потери времени на обновление окна, не рисуя части блока, не попавшие в видимую в данный момент область.
FullDraw(BOOL)
  Логическое поле, указывающее на необходимость полной перерисовки всего изображения блока (TRUE) или только тех его частей, которые изменились с момента последнего рисования (FALSE). Если в параметрах подсистемы включен флаг «в системе только неподвижные не перекрывающиеся блоки», при обновлении окна такой подсистемы по таймеру RDS будет вызывать рисование всех ее блоков с FullDraw равным FALSE, а во всех остальных случаях – с FullDraw равным TRUE. Таким образом, если окно не было перекрыто другими окнами и его изображение сохранилось на экране с момента последнего рисования, модель блока сможет избежать потерь времени на перерисовку не изменившихся частей изображения. Подобная оптимизация рисования подробно рассмотрена в §2.10.2 руководства программиста.

Пример

Модель блока, рисующего себя в виде белого прямоугольника с черной рамкой. Толщина рамки равна двум точкам экрана в масштабе 100%, в других масштабах она пропорционально уменьшается или увеличивается. Размер прямоугольника совпадает с размером всего блока, заданным пользователем.

    extern "C" __declspec(dllexport) int RDSCALL ModelDraw(
      int CallMode,             // Событие
      RDS_PBLOCKDATA BlockData, // Данные блока
      LPVOID ExtParam)          // Дополнительные параметры
    { RDS_PDRAWDATA DrawData;
      switch(CallMode)
        { case RDS_BFM_DRAW: // Рисование
            DrawData=(RDS_PDRAWDATA)ExtParam;
            // Цвет и стиль рамки
            rdsXGSetPenStyle(0,PS_SOLID,
              2*DrawData->DoubleZoom,0,R2_COPYPEN);
            // Цвет фона
            rdsXGSetBrushStyle(0,RDS_GFS_SOLID,0xffffff);
            // Прямоугольник
            rdsXGRectangle(DrawData->Left,
                           DrawData->Top,
                           DrawData->Left+DrawData->Width,
                           DrawData->Top+DrawData->Height);
            break;
        }
      return RDS_BFR_DONE;
    }

См. также

RDS_BFM_DRAWADDITIONAL, графические функции RDS.