Скачиваний:
58
Добавлен:
06.02.2016
Размер:
524.8 Кб
Скачать

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;

Соседние файлы в папке Лабораторные_занятия