Кому интересно как деалются приложения под 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);
}