- •Лабораторные работы 5-6
- •Модель управления ресурсами в локальной вычислительной сети.
- •Int Next_top; /* Номер следующего узла */
- •Построение замкнутой модели многопользовательской информационной системы
- •1.3. Модель бизнес-процесса «эффективность предприятия»
- •2. Построение интерфейса пользователя
- •2.1. Построение диалогового окна настройки параметров модели.
- •6.2.Использование функционального окна визуализации работы модели.
- •Void *pointer; // Настраиваемый указатель любой области
- •Int next; // Номер «текущего» узла
- •Void funcwindow(struct fwcb*);
- •Void funcwindow(struct fwcb *s)
- •Int xL; // X левого верхнего угла эллипса
- •InvalidateRect(shwnd,null,1);
Int next; // Номер «текущего» узла
int error; // Фатальная ошибка в модели
int maxn; // Число узлов модели
int presise; // Количество знаков после десятичной точки
int maxX; // Размеры экрана X
int maxY; // Размеры экрана Y
int percent; // Процент выполнения модели
int stop0; // Признак выполнения модели
int stop1; // Признак приостановки
int stop2; // Признак отладки/трассировки
int stop3; // Установить масштаб времени
char modname[16]; // Название модели
char filename[256]; // Имя найденного файла
};
Рассмотренная область описана в системном h-файле Simulate.h. В соответствии с ее структурой ниже приведен текст программы, реализующей окно типа «часы моделирования». Следует отметить, что в данной программе значительное место занимают операторы, необходимые для автоматизации размещения текстов и изображений на заданном прямоугольнике. Если это окно сделать без такого сервиса, то программа будет значительно короче (и понятнее).
#include <Windows.h>
#include <Simulate.h>
Void funcwindow(struct fwcb*);
BOOL WINAPI DllEntryPoint(HINSTANCE hDLL, DWORD dwReason,
LPWORD Reserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
{
break;
}
case DLL_PROCESS_DETACH:
{
break;
}
}
return TRUE;
}
Void funcwindow(struct fwcb *s)
{
TEXTMETRIC tm; // Метрики текста
SIZE size; // Для метрик текста
time_t ct; // Для таймера ЭВМ
char str[3000]; // Буфер для строки вывода
char comwork[96]; // для измерений длин текстов
struct tm *newtime; // Для компьютерного таймера
struct kcb *k; // Адрес узла модели
double ap; // Текущий угол
double hp; // Шаг угла
float p; // Проценты с плавающей точкой
Int xL; // X левого верхнего угла эллипса
int yL; // Y левого верхнего угла эллипса
int wE; // Ширина эллипса
int hE; // Высота эллипса
int xLp; // X левого края прямоугольного индикатора
int xRp; // X правого края прямоугольного индикатора
int yHp; // Y верхнего края прямоугольного индикатора
int yLp; // Y правого края прямоугольного индикатора
int wX; // Текущие координаты вывода X
int wY; // Текущие координаты вывода Y
int xS1; // Рабочая координата X
int xS2; // Рабочая координата Y
int yS; // Рабочая координата Y
int iP; // Рабочая переменная для процентов
int i; // Рабочая переменная
shOldf=(HFONT)SelectObject(smemdc,shNewf); // Шрифт ANSI
if (!SetWindowLong(shwnd,GWL_WNDPROC,smywndproc))
MessageBox(shwnd,"","Не подключена программа MyWindowProcedure",
MB_OK);
hp=pi/100;
p=stimer/stmax*100;
iP=p;
if (iP>100)
iP=100;
if ( iP>spercent || spercent ==100 ||
(spercent && ! sstop0 && ! sstop1 && ! sstop2 && ! sstop3))
{
MessageBeep(1);
ap=hp*p+0.0001;
if (ap>pi)
ap=pi;
xRp=smaxX–2;
yHp=2;
GetTextMetrics(smemdc,&tm); // Метрики текста
sprintf(comwork,"Процент выполнения: 100 ");
GetTextExtentPoint32(smemdc,comwork,strlen(comwork),&size);
i=xRp–size.cx;
xLp=i;
sprintf(comwork,"Модель \"%s\"",smodname);
GetTextExtentPoint32(smemdc,comwork,strlen(comwork),&size);
i=xRp–size.cx;
if (i < xLp )
xLp=i;
ct=time(NULL); // Получить новое время
newtime=localtime(&ct);
strcpy(str,asctime(newtime)); // Новое время – в буфер
str[strlen(str)–1]='\0'; // Удалить \r\n !
GetTextExtentPoint32(smemdc,str,strlen(str),&size);
i=xRp–size.cx–10;
if (i < xLp )
xLp=i;
xLp–=9;
yLp = yHp + 3 + 12*(tm.tmHeight + tm.tmExternalLeading)+3;
wX=xLp+3; // Текущий X текста
wY=yHp+3; // Текущий Y текста
TextOut(smemdc,wX,wY,comwork,strlen(comwork)); // Название модели
wY = wY + 9*(tm.tmHeight + tm.tmExternalLeading);
TextOut(smemdc,wX,wY,str,strlen(str)); // Время
wY = wY + (tm.tmHeight + tm.tmExternalLeading);
sprintf(str,"Процент выполнения: %3d ",iP);
TextOut(smemdc,wX,wY,str,strlen(str)); // Процент
wY = wY + (tm.tmHeight + tm.tmExternalLeading);
if (iP == 100)
{
sprintf(str,"Выполнена... ");
TextOut(smemdc,wX,wY,str,strlen(str));
}
else if (snd == 0)
{
sprintf(str,"Моделирование ");
TextOut(smemdc,wX,wY,str,strlen(str));
}
xL=(xLp+xRp)/2; // X и Y центра эллипса
hE=6*(tm.tmHeight + tm.tmExternalLeading); // Высота эллипса
wE=hE; // Ширина эллипса
xL=xL–hE/2.0; // X левого верхнего угла
yL=yHp+3+2*(tm.tmHeight + tm.tmExternalLeading); // Y левого верхнего
SelectObject(smemdc,shRedpen); // Выбрать красное перо
SelectObject(smemdc,s>hWhitebrush); // Выбрать белую кисть
Ellipse(smemdc,xL,yL,xL+wE,yL+hE); // Эллипс
xS1=xL+wE*(1–sin(ap))/2;
xS2=xL+wE*(1+sin(ap))/2;
yS =yL+hE*(1+cos(ap))/2;
SelectObject(smemdc,shCyanbrush); // Бирюзовая кисть
Pie(smemdc,xL,yL,xL+wE,yL+hE,xS1,yS,xS2,yS); // Сектор
SelectObject(smemdc,shBluepen); // Выбрать синее перо
MoveToEx(smemdc,xL+wE/2–1,yL–smaxY/60,NULL);
LineTo(smemdc,xL+wE/2–1,yL+hE+smaxY/60);
MoveToEx(smemdc,xL–smaxX/80,yL+hE/2–1,NULL);
LineTo(smemdc,xL+wE+smaxX/80,yL+hE/2–1);
SelectObject(smemdc,shHollowbrush); // Прозрачная кисть
SelectObject(smemdc,s–>hGreenpen); // Выбрать зеленое перо
Rectangle(smemdc,xLp,yLp,xRp,yHp); // Прямоугольник
spercent=iP;