Приложения
Приложение А. Функции, константы и структуры 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 вызывается для блока, модель которого рисует внешний вид блока программно, в момент обновления окна подсистемы, в которой находится этот блок. Для включения программного рисования в окне параметров блока должен быть установлен флаг «», в противном случае блок будет изображаться либо векторной картинкой, либо прямоугольником с текстом, и реакция 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; }
См. также