#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 menu int 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 flag char *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;// undo while(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 = 5 if(Selection==NONE) Msg(\"No Selection !\"); else Msg(fm[Selection]); if(Selection==4) break; } if(MouseOn(&Edit)) { PullMenuDown(em,6,&Edit);// no. of items = 6 if(Selection==NONE) Msg(\"No Selection !\"); else Msg(em[Selection]); } if(MouseOn(&Help)) { PullMenuDown(hm,2,&Help);// no. of items = 2 if(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); }