Навигация:
<< >> Оглавление Указатель

Приложения

Приложение А. Функции, константы и структуры 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 {
     dc;                 // Контекст устройства рисования
     CalcMode;          // Текущий режим RDS
     BlockX,BlockY; // Координаты точки привязки
                            // блока в окне
    double DoubleZoom;      // Масштаб окна (в долях единицы)
     RectValid;         // Флаг изменения размеров блока
     Left,Top;      // Верхний левый угол блока
     Width,Height;  // Ширина и высота блока
     *VisibleRect;      // Видимая в окне часть рабочего поля
     FullDraw;          // Необходимо перерисовать весь блок
  } RDS_DRAWDATA;
  typedef RDS_DRAWDATA *RDS_PDRAWDATA;

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

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

Пример

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

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

См. также

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


<< >> Оглавление Указатель