#include <conio.h>
#include<dos.h>
#include <graphics.h>
#include<stdio.h>
#include<stdlib.h>
#define NO 0
#define YES 1
#define NONE -1
#define MAX_MENU 7//change this according to maximum no. of items in the menuint X,Y;
int Selection;
int button,x,y;
void *p;
size_t area;
struct MENU
{
int x;
int y;
int x1;
int y1;
unsigned char Active[MAX_MENU];// Item Activation flagchar *head;// name of menu ( can be eliminated)
};
int MouseOn(struct MENU *t);
void Process();
void Xorbar(int sx,int sy,int ex,int ey,int c);
void Show();
void Hide();
void Status();
// To change the position of button just change these values here,no need// to touch rest of the code.struct MENU File={200,110,250,130};
struct MENU Edit={295,110,345,130};
struct MENU Help={390,110,440,130};
struct MENU Close={600,10,620,30};
struct MENU Synt={380,300,460,315};
void main()
{
int gd = DETECT,gm;
initgraph(&gd, &gm,"");
Selection=NONE;
for(gd=0;gd<MAX_MENU;gd++)
{
File.Active[gd]=YES;
Edit.Active[gd]=YES;
Help.Active[gd]=YES;
Close.Active[gd]=YES;
}
File.head="[ File Menu ]";
Edit.head="[ Edit Menu ]";
Help.head="[ Help Menu ]";
Close.head="[ Exit ]";
area=imagesize(0,0,150,150);
p=malloc(area);
if(p==NULL)
{
closegraph();
restorecrtmode();
printf("Not Enough Memory !\n try to reduce the area used.\n");
exit(1);
}
setfillstyle(1,7);
bar(0,0,640,480);
X=2;Y=2;
Process();
End();
closegraph();
printf("GUI-MENUS\n");
getch();
}
void Process()
{
char *fm[]={"New","Open","Save","Save as","Exit"};
char *em[]={"Undo","Cut","Copy","Paste","Delete","Select All"};
char *hm[]={"Help Topics","About Menus"};
// if you chage no. of items here then you need to chage that in// function PullMenuDown(char *,int);char KEY;
// draw buttons
Win(140,100,500,140);
DrawBtn(&File,"File");
DrawBtn(&Edit,"Edit");
DrawBtn(&Help,"Help");
settextstyle(0,0,0);
outtextxy(Close.x+7,Close.y+7,"x");
Comments();
Show();
// you can set active & disable item in the menu as shown below,// here 'save as' is set to be disable.
File.Active[3]=NO;// Save as
Edit.Active[0]=NO;// undowhile(1)
{
if(kbhit())
{
KEY=getch();
if(KEY==27|| KEY==45) break;
}
Status();
if(button==1)
{
if(MouseOn(&Close)) break;
if(MouseOn(&File))
{
PullMenuDown(fm,5,&File);// no. of items = 5if(Selection==NONE) Msg("No Selection !");
else Msg(fm[Selection]);
if(Selection==4) break;
}
if(MouseOn(&Edit))
{
PullMenuDown(em,6,&Edit);// no. of items = 6if(Selection==NONE) Msg("No Selection !");
else Msg(em[Selection]);
}
if(MouseOn(&Help))
{
PullMenuDown(hm,2,&Help);// no. of items = 2if(Selection==NONE) Msg("No Selection !");
else Msg(hm[Selection]);
if(Selection==1) Msg("* Syntax-Example *");
}
}
else
{
if(MouseOn(&File)) Hlight(&File);
if(MouseOn(&Edit)) Hlight(&Edit);
if(MouseOn(&Help)) Hlight(&Help);
if(MouseOn(&Close)) Hlight(&Close);
if(MouseOn(&Syntax-Empl))
{
Msg("http://www.syntax-example.com");
while(MouseOn(&Syntax-Empl))
{
Status();
if(button!=0) break;
if(kbhit()) break;
}
Msg("");
}
}
}
Msg(":: Bye Bye ::");
}
DrawBtn(struct MENU *tm,char *txt)
{
setcolor(0);
settextstyle(2,0,4);
outtextxy(tm->x+15,tm->y+4,txt);
}
Hlight(struct MENU *t)
{
winp(t,0);
Msg(t->head);
while(MouseOn(t))
{
Status();
if(button!=0) break;
if(kbhit()) break;
}
setcolor(7);
Hide();
rectangle(t->x,t->y,t->x1,t->y1);
Msg("");
Show();
}
int MouseOn(struct MENU *t)
{
int flag;
flag=0;
if(x>=t->x && x<=t->x1 && y>=t->y && y<=t->y1) flag=1;
return flag;
}
void Xorbar(int sx,int sy,int ex,int ey,int c)
{
int i;
setwritemode(1);
setcolor(c);
Hide();
for(i=sy;i<=ey;i++)
line(sx,i,ex,i);
Show();
setwritemode(0);
}
Push(struct MENU *tm)
{
winp(tm,1);
while(button==1)
{
Status();
if(kbhit()) break;
}
}
Up(struct MENU *tm)
{
setcolor(7);
Hide();
rectangle(tm->x,tm->y,tm->x1,tm->y1);
Show();
while(button==1)
{
Status();
if(kbhit()) break;
}
}
PullMenuDown(char *H[],int n,struct MENU *tm)
{
int i;
i=n*20;
// save background
Push(tm);
Hide();
getimage(tm->x+1,tm->y1+2,tm->x+100,tm->y1+i+5,p);
Win(tm->x+1,tm->y1+2,tm->x+100,tm->y1+i+5);
setcolor(0);
settextstyle(2,0,4);
for(i=0;i<n;i++)
{
if(!tm->Active[i])
{
setcolor(15);
outtextxy(tm->x+15,tm->y1+9+i*20,H[i]);
setcolor(0);
outtextxy(tm->x+14,tm->y1+8+i*20,H[i]);
}
else outtextxy(tm->x+14,tm->y1+8+i*20,H[i]);
}
Show();
while(button==1) Status();
HandleMenu(n,tm);
}
PullMenuUp(int n,struct MENU *tm)
{
int i;
//load background
Hide();
putimage(tm->x+1,tm->y1+2,p,COPY_PUT);
Show();
Up(tm);
}
HandleMenu(int n,struct MENU *tm)
{
int i;
char Key;
setcolor(0);
Selection=NONE;
i=0;
while(1)
{
Status();
if(button==1) break;
for(i=0;i<n;i++)
{
Status();
if(MouseOn1(tm->x+4,tm->y1+6+i*20,tm->x+97,tm->y1+22+i*20))
{
Xorbar(tm->x+3,tm->y1+6+i*20,tm->x+97,tm->y1+22+i*20,14);
while(MouseOn1(tm->x+4,tm->y1+6+i*20,tm->x+97,tm->y1+22+i*20))
{
Status();
if(button==1)
{
if(tm->Active[i]==YES)
{
Selection=i;
break;
}
else
Selection=NONE;
}
if(kbhit()) break;
}
Xorbar(tm->x+3,tm->y1+6+i*20,tm->x+97,tm->y1+22+i*20,14);
}
}
}
PullMenuUp(n,tm);
}
MouseOn1(int cx,int cy,int cx1,int cy1)
{
int flag;
flag=0;
if(x>=cx && x<=cx1 && y>=cy && y<=cy1) flag=1;
return flag;
}
// Mouse & win routines
union REGS i,o;
struct SREGS ss;
void Show()
{
i.x.ax=1;
int86(0x33,&i,&o);
}
void Hide()
{
i.x.ax=2;
int86(0x33,&i,&o);
}
void Status()
{
i.x.ax=3;
int86(0x33,&i,&o);
button=o.x.bx;
x=o.x.cx;
y=o.x.dx;
}
winp(struct MENU *t,int state)
{
Hide();
if(state==1)
{
setcolor(0);
line(t->x,t->y,t->x,t->y1);
line(t->x,t->y,t->x1,t->y);
setcolor(15);
line(t->x1,t->y,t->x1,t->y1);
line(t->x,t->y1,t->x1,t->y1);
}
else
{
setcolor(15);
line(t->x,t->y,t->x,t->y1);
line(t->x,t->y,t->x1,t->y);
setcolor(0);
line(t->x1,t->y,t->x1,t->y1);
line(t->x,t->y1,t->x1,t->y1);
}
Show();
}
Win(int sx,int sy,int ex,int ey)
{
Hide();
setfillstyle(1,7);
bar(sx,sy,ex,ey);
setcolor(15);
line(sx,sy,sx,ey);
line(sx,sy,ex,sy);
setcolor(0);
line(ex,sy,ex,ey);
line(sx,ey,ex,ey);
Show();
}
Msg(char *m)
{
int l;
setcolor(14);
rectangle(18,438,622,477);
setfillstyle(1,0);
bar(20,440,620,475);
if(MouseOn(&Syntax-Empl))
{
settextstyle(2,0,7);
setcolor(11);
l=textwidth(m)/2;
outtextxy(320-l,440,m);
}
else
{
settextstyle(2,0,8);
setcolor(15);
l=textwidth(m)/2;
outtextxy(320-l,440,m);
outtextxy(321-l,441,m);
}
}
Comments()
{
setfillstyle(1,0);
bar(140,5,500,40);
setcolor(14);
rectangle(140,5,500,40);
settextstyle(2,0,8);
setcolor(15);
outtextxy(260,10,"GUI-MENUS");
setfillstyle(1,8);
bar(140,150,502,402);
setcolor(14);
rectangle(138,148,502,402);
Msg("Welcome !");
settextstyle(2,0,5);
setcolor(10);
outtextxy(158,180,"Hello Friends !");
settextstyle(2,0,4);
outtextxy(260,200,"Here i am with my menu program.");
outtextxy(158,220,"As you can see it's like windows menu,you can");
outtextxy(158,240,"add more menus to it. It's just a concept for");
outtextxy(158,260,"building more menus. I hope you will like my effort,");
}
End()
{
int i,j;
setcolor(0);
Hide();
for(j=0;j<40;j++)
{
for(i=0;i<481;i+=20)
line(0,0+i+j,640,j+0+i);
delay(100);
if(kbhit()) if(getch()==27) break;
}
settextstyle(2,0,5);
setcolor(15);
outtextxy(220,180,"Thanks for being with us !");
Show();
delay(3000);
}