Кому интересно как деалются приложения под DOS с графикой то я нашёл одну из списка курсовых в инете.
Собственно программа-меню, текст программы:
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <math.h>
class Point
{
int x, y;
public:
Point(){}
Point(int _x, int _y) { x=_x; y=_y; }
int getx(){ return x; }
int gety(){ return y; }
void draw(int color) { setcolor(color); circle(x, y, 3); }
};
long sd(Point p1, Point p2, Point p3)
{
return ((long)(p3.getx()-p1.getx())*(long)(p2.gety()-p1.gety())-(long)(p2.getx()-p1.getx())*(long)(p3.gety()-p1.gety()));
}
int Peretyn(Point p1, Point p2, Point p3, Point p4)
{
if (sd(p1, p2, p3)*sd(p1, p2, p4)<=0 && sd(p3, p4, p1)*sd(p3, p4, p2)<=0) return 1;
return 0;
}
class Polygon
{
Point p1, p2, p3, p4;
long s;
public:
Polygon(){ s = 0; }
Polygon(Point _p1, Point _p2, Point _p3, Point _p4)
{
p1=_p1; p2=_p2; p3=_p3; p4=_p4; s=0;
Point t;
if (Peretyn(p1, p2, p3, p4))
{
t=p2; p2=p3; p3=t;
}
else
if (Peretyn(p2, p3, p4, p1))
{
t=p1; p1=p2; p2=t;
}
}
void Calc()
{
s+=(long)(p1.getx()-p2.getx())*(long)(p1.gety()+p2.gety());
s+=(long)(p2.getx()-p3.getx())*(long)(p2.gety()+p3.gety());
s+=(long)(p3.getx()-p4.getx())*(long)(p3.gety()+p4.gety());
s+=(long)(p4.getx()-p1.getx())*(long)(p4.gety()+p1.gety());
s=labs(s)/2;
}
long gets() { return s; }
void sets(long _s) { s=_s; }
void draw(int color)
{
setcolor(color);
moveto(p4.getx(), p4.gety());
lineto(p1.getx(), p1.gety());
lineto(p2.getx(), p2.gety());
lineto(p3.getx(), p3.gety());
lineto(p4.getx(), p4.gety());
}
};
float Angle(Point p1, Point p2)
{
long dx = (p2.getx()-p1.getx());
long dy = (p2.gety()-p1.gety());
if (dx==0 && dy==0) return 0;
float res = float(dx*dx)/(float(dx*dx+dy*dy));
if (dx<0) res=-res;
return res;
}
int main()
{
clrscr();
FILE *f=fopen("rect1.txt", "r");
int i, j, n;
char s[200];
fgets(s, 200, f);
for(n=0;!feof(f);++n) fgets(s, 200, f);
rewind(f);
Point* p=new Point[n];
fgets(s, 200, f);
for(i=0; i<n; i++)
{
int x, y;
fscanf(f, "%s%s%s%d%s%s%d%s", s, s, s, &x, s, s, &y, s);
p[i]=Point(x, y);
if (x<p[0].getx() || (x==p[0].getx() && y<p[0].gety()))
{
Point t=p[0]; p[0]=p[i]; p[i]=t;
}
}
Polygon test(Point(10, 0), Point(10, 1), Point(9, 1), Point(9, 2));
for(i=1; i<n; i++)
{
float An = Angle(p[0], p[i]);
int nom = i;
for(j=i+1; j<n; j++)
{
float an = Angle(p[0], p[j]);
if (an<An)
{
An = an; nom = j;
}
}
Point t = p[i]; p[i]=p[nom]; p[nom]=t;
}
int gd=DETECT, gm;
initgraph(&gd, &gm, "e:\\tc\\bgi");
if (graphresult()!=grOk)
{
printf("ERROR!\n");
return 1;
}
setcolor(GREEN);
for(i=0; i<n; i++)
p[i].draw(GREEN);
int i1, i2, i3, i4;
Polygon pmin, pmax; pmin.sets(1000000000);
for(i1=0; i1<n; i1++)
for(i2=i1+1; i2<n; i2++)
for(i3=i2+1; i3<n; i3++)
for(i4=i3+1; i4<n; i4++)
{
if (i1==40 && i2==43 && i3==47 && i4==49)
{
i2=i2;
}
Polygon pp = Polygon(p[i1], p[i2], p[i3], p[i4]);
pp.Calc();
if (pp.gets()>pmax.gets()) pmax=pp;
if (pp.gets()<pmin.gets())
pmin=pp;
}
pmin.draw(RED);
pmax.draw(YELLOW);
getch();
closegraph();
}
Текст програми меню
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include<graphics.h>
#include<string.h>
#include<process.h>
#include <stdlib.h>
#include <math.h>
#include <dir.h>
#include "clases.h"
#define LEFT 75
#define RIGHT 77
#define ENTER 13
char bc_path[255]="e:\\tc\\BIN\\tc.exe";
char bc_path1[255]="e:\\tc\\BIN\\";
int findfile(void);
void f_file(char *fname);
void generateNewInfile(void);
/**********************************************/
class MenuItem
{
int x1;
int y1;
int x2;
int y2;
char str[80];
public:
void setParam(int xx1,int yy1,int xx2,int yy2,char *sstr)
{
x1=xx1;
y1=yy1;
x2=xx2;
y2=yy2;
strcpy(str,sstr);
};
void showAct(void);
void showPas(void);
void About(void);
void Run(int);
};
void MenuItem::showPas(void)
{
setviewport(x1,y1,x2,y2,1);
setfillstyle(1,0);
bar(1,1,x2,15);
setfillstyle(1,8);
bar(1,1,x2-1,14);
setfillstyle(1,15);
bar(0,0,x2-2,13);
setfillstyle(1,7);
bar(1,1,x2-2,13);
setcolor(15);
outtextxy(6,4,str);
setcolor(0);
outtextxy(5,3,str);
};
void MenuItem::showAct(void)
{
setviewport(x1,y1,x2,y2,1);
setfillstyle(1,0);
bar(0,0,x2,15);
setfillstyle(1,9);
bar(2,3,x2,14);
setcolor(12);
outtextxy(7,5,str);
setcolor(10);
outtextxy(6,4,str);
};
void MenuItem::About(void)
{
char str[80];
window(10,5,70,15);
FILE*f1=fopen("About.dat","r");
for(int i=0;i<3;i++)
{
fgets(str,80,f1);
gotoxy(1,i+1);
printf("%s",str);
i++;
};
getch();
};
void MenuItem::Run(int activ)
{
switch (activ) {
case 0: About();
break;
case 1: f_file("input.txt");
break;
case 2: f_file("menu.cpp");
break;
case 3: int res = spawnl(P_WAIT,"circles.exe",NULL);
break;
case 4: closegraph();
exit(0);
break;
};
};
/***************************************************/
class Menu
{
MenuItem mits[5];
int nomAct;
int oldNomAct;
void onLeft(void);
void onRight(void);
void onEnter(void);
void show(void);
void show1(void);
public:
Menu(int xx,int yy);
void getMessage(int msg);
};
Menu::Menu(int xx,int yy)
{
int x,y;
x=xx;
y=yy;
char str[80];
FILE *f;
f=fopen("menudata.txt","r");
for(int i=0;i<5;i++)
{
fgets(str,80,f);
mits[i].setParam(x,y,x+strlen(str)*8+1,y+15,str);
x+=strlen(str)*8+3;
};
nomAct=0;
oldNomAct=1;
show();
};
void Menu::getMessage(int msg)
{
switch(msg)
{
case LEFT:
onLeft();
show1();
break;
case RIGHT:
onRight();
show1();
break;
case ENTER:
onEnter();
show1();
};
};
void Menu::onLeft(void)
{
oldNomAct=nomAct;
nomAct=(nomAct==0)?4:nomAct-1;
};
void Menu::onRight(void)
{
oldNomAct=nomAct;
nomAct=(nomAct==4)?0:nomAct+1;
};
void Menu::onEnter(void)
{
mits[nomAct].Run(nomAct);
};
void Menu::show(void)
{
int gdr=DETECT,gm;
initgraph(&gdr,&gm,"e:\\tc\\bgi");
setfillstyle(1,0);
bar(0,0,639,479);
for(int i=0;i<5;i++)
if(i==nomAct)
mits[i].showAct();
else
mits[i].showPas();
};
void Menu::show1(void)
{
for(int i=0;i<5;i++)
if(i==nomAct)
mits[i].showAct();
else
mits[i].showPas();
};
//**********************************************
main()
{
Menu mnu(40,40);
while(1)
mnu.getMessage(getch());
}
int findfile()
{
struct ffblk ffblk;
if(findfirst(bc_path,&ffblk,0)==0) return 1;
for(;;)
{
cleardevice();
gotoxy(1,1);
cout << "\nЌҐ¬®¦г § ©вЁ । Єв®а д ©«iў.";
cout << "\n‚ўҐ¤iвм и«пе в i¬'п д ©«г вЁЇг bc.exe";
cout << "\nЌ ЇаЁЄ« ¤ C:\\bc\\bin\\bc.exe Ў® exit ¤«п ўЁе®¤г.\n";
cin >> bc_path;
if(bc_path[0]=='e'&&bc_path[1]=='x')
{
cleardevice();
return 0;
}
if(findfirst(bc_path,&ffblk,0)==0)
{
cleardevice();
return 1;
}
else
{
cout << "\n” ©«\n"<<bc_path<<"\nҐ§ ©¤Ґ® Ў® ҐЄ®аЄвҐ i'¬п д ©«г\n";
getch();
}
}
}
void f_file(char *fname)
{
if(findfile()==0) return;
char cmd[250];
strcpy(cmd, "notepad ");
strcat(cmd,bc_path1);
strcat(cmd,fname);
system(cmd);
}