中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 转贴:用c语言做一个图形界面"程序"
作者:
标题: 转贴:用c语言做一个图形界面"程序" 上一主题 | 下一主题
lydong
元老会员




积分 1468
发帖 407
注册 2002-10-21
来自 广州
状态 离线
『楼 主』:  转贴:用c语言做一个图形界面"程序"

文章摘要:   这个小程序引用了c语言中的图形函数,构造了一个640*480的图形界面,其中包括了一个静态的菜单。程序中可以有一段音乐(当然是pc喇叭放出的难以忍受的音乐),可以驱动鼠标,画指定大小的圆(稍作修改一下就可画出多种图形了),执行ms-dos命令,还有一小段动画(崭且称之为动画吧,实在太不起眼了),有帮助信息提示如何操作,虽小,但应用了c给我们的较多功能。 -------------------------------------------------------------------------------- 正文: 用c语言做一个图形界面"程序"   今天看了秦岭兄的"C语言制作的下拉文本菜单"一文,突然想起我在上学期做的一次课程设计,也想发表出来,供大家品论。   这个小程序引用了c语言中的图形函数,构造了一个640*480的图形界面,其中包括了一个静态的菜单。程序中可以有一段音乐(当然是pc喇叭放出的难以忍受的音乐),可以驱动鼠标,画指定大小的圆(稍作修改一下就可画出多种图形了),执行ms-dos命令,还有一小段动画(崭且称之为动画吧,实在太不起眼了),有帮助信息提示如何操作,虽小,但应用了c给我们的较多功能。   这是我在大二开学初匆忙完成的(为了应付作业),其中有很多不当之处,比如,用了不被人看好的goto语句,没有层次等,希望大家予以指正。   标题中的引号,是因为他根本算不上什么程序,不能解决什么问题。因为看了秦岭兄的文章,才斗胆将它拿出来。以下时源代码部分,保持原文,其中还有我当时的一些充满好奇的注释,也希望能给初学者(我自己也是一个初学者)一点提示。 /**************************launch*******************************// #include #include #include #include #include #define TRUE 1 #define FALSE 0 #define KB_S_N_DOWN 80 #define KB_S_N_UP 72 #define KB_S_N_ENTER 28 #define KB_S_N_F1 59 #define KB_S_N_A 29 #define KB_S_N_D 32 #define KB_S_N_C 31 #define KB_S_N_M 50 #define KB_S_N_Q 16 #define KB_S_N_S 33 #define PopWindow 8 #define WindowMinX 0 #define WindowMinY 0 #define WindowMaxX 639 #define WindowMaxY 479 union REGS regs; int init(); int read(); void cursor(),newxy(); void MessageBox(char *Message); /*Define function*/ int get_key(); int get_item(int,int); void *buf_curse; main() { int driver,mode; int row,item_num,done,k; int j,gdriver,gmode,size; void *buf; int i; int a[]={657,8000,1,2000,657,10000,698,10000,784,8000,1,2000, 784,10000,698,10000,657,10000,587,10000,523,8000,1,2000, 523,10000,587,10000,657,8000,1,2000,657,15000,587,3000, 1,2000,587,20000,657,8000,1,2000,657,10000,698,10000, 784,8000,1,2000,784,10000,698,10000,657,10000,587,10000, 523,8000,1,2000,523,10000,587,10000,657,10000,587,150000, 523,3000,1,2000,523,20000, 587,8000,1,2000,587,10000,657,10000,523,10000,587,10000, 657,5000,698,5000,657,10000,523,10000,587,10000,657,5000, 698,5000,657,10000,587,10000,523,10000,587,10000,392,20000, 657,8000,1,2000,657,10000,698,10000, 784,8000,1,2000,784,10000,698,10000,657,10000,587,10000, 523,8000,1,2000,523,10000,587,10000,657,10000,587,15000, 523,3000,1,2000,523,20000,1,10000}; gdriver=DETECT; registerbgidriver(EGAVGA_driver); initgraph(&gdriver,&gmode,""; setbkcolor(BLUE); cleardevice(); setcolor(YELLOW); setlinestyle(0,0,1); setfillstyle(1,5); settextstyle(1,0,9); circle(100,200,30); outtextxy(100,215,"Welcome!"; floodfill(100,215,YELLOW); settextstyle(2,0,5); setcolor(WHITE); outtextxy(110,310,"press any key to continue..."; /*floodfill(110,310,BLACK);*/ settextstyle(3,0,2); outtextxy(180,450,"?2000 Awaresoft.All Rights Reserved."; size=imagesize(69,169,131,231); buf=malloc(size); getimage(69,169,131,231,buf); putimage(500,169,buf,COPY_PUT); do { for(j=0;j<185;j++) { putimage(70+j,170,buf,COPY_PUT); putimage(500-j,170,buf,COPY_PUT); } for(j=0;j<185;j++) { putimage(255-j,170,buf,COPY_PUT); putimage(315+j,170,buf,COPY_PUT); } }while(!kbhit()); getch(); MENU: driver=DETECT; mode=0; registerbgidriver(EGAVGA_driver); initgraph(&driver,&mode,""; init(WindowMinY,WindowMaxX,WindowMinX,458); /*init is a defined function*/ size=imagesize(0,0,90,22); /*count the bytes needs for the image*/ if(size!=1) /*if it isn't only one byte*/ buf_curse=malloc(size); /*apply the ram space*/ /*get ligh bar */ setfillstyle(1,13); /*1:solid_fill;13:color*/ bar(0,0,90,22); /*draw a rectangle without the bound*/ getimage(0,0,90,22,buf_curse); /*copy image to buf_curse*/ setfillstyle(1,BLACK); /*the same as line66*/ bar(0,0,91,23); /*left,top,right,bottom*/ /*display menu */ setcolor(YELLOW); /*set the color yellow*/ rectangle(0,0,639,479); rectangle(0,457,639,479); /*l t r b*/ setfillstyle(1,RED); /*fill with color lightgray*/ bar(1,458,638,478); /*rectangle*/ setcolor(BLUE); outtextxy(10,467,"F1-Help Alt_D-Draw Alt_S-SOUND Alt_M-MS-DOS Alt_Q-Quit"; setfillstyle(1,BLUE); /*print the string at 10,467 and color it blue*/ rectangle(544,1,638,150); /*is it necessary?*/ bar(544,1,638,150); item_num=6; /*6 item and it's a useful point*/ setcolor(YELLOW); for(k=0;k<item_num;k++){ rectangle(544,k*25,638,25+k*25); floodfill(544,k*25,YELLOW); } /*draw four rectangles in a column*/ setcolor(WHITE); outtextxy(548,10,"Draw"; outtextxy(548,35,"Clean"; outtextxy(548,60,"Ms-DOS"; outtextxy(548,85,"Quit"; /*fill the four rectangles with words*/ outtextxy(548,110,"Sound"; outtextxy(548,135,"About..."; /*added hot key*/ setcolor(LIGHTRED); outtextxy(548,10,"D"; outtextxy(548,35,"C"; /*cover the 'D' with another 'D'with a special color*/ outtextxy(548,60,"M"; outtextxy(548,85,"Q"; outtextxy(548,110,"S"; outtextxy(548,135,"A"; /*display light bar on first menu item*/ putimage(545,1,buf_curse,XOR_PUT); /*output the 'getimage'at 545,1;buf_curse:size;XOR_PUT:can be recognized by putimage()*/ setcolor(WHITE); /*set color*/ row=0; done=FALSE; do{ row=get_item(row,item_num); /*get_item is a function defined by me*/ switch(row){ case 0: /*do function*/ setcolor(LIGHTRED); bar(1,458,638,478); Mouse(); /*defined*/ goto MENU; /*?*/ case 1: putimage(545,1+row*25,buf_curse,XOR_PUT); row=0; putimage(545,1+row*25,buf_curse,XOR_PUT); break; case 2: /*enter MS-DOS*/ free(buf_curse); /*free the rom space*/ done=TRUE; /*make done equal to TRUE???*/ restorecrtmode(); /*a function in graphic.h*/ system(""; /*a lib function*/ goto MENU; case 3: /*quit*/ setcolor(WHITE); MessageBox("Made by XuJiwei.";/*defined function*/ done=TRUE; closegraph(); /*make it out of the graphics condition,may be used later.*/ exit(0); /*end properly*/ case 4: /*play the music*/ for(i=0;i<154;i++) {if(a1500) delay(a); if(a==1) nosound(); } goto MENU; /*about*/ case 5: outtextxy(100,100,"It is a free software,made by turboc2.0,"; outtextxy(100,120,"there must be some bugs,I hope to commun"; outtextxy(100,140,"-icate with you and kill them,and hope t "; outtextxy(100,160,"-o be your friend,for more information,p"; outtextxy(100,180,"-lease write to #2140 HIT(zip code150001"; outtextxy(100,200,",or bill_e@sina.com"; outtextxy(100,220," by XuJiwei,09-23-00."; getch(); goto MENU; } }while(!done); /*!done means FAUSE*/ restorecrtmode(); } /*by now,the program comes to an end*/ /*creat several functions*/ int get_item(int row,int item_num) { int key,done; done=FALSE; do{ key=get_key(); switch(key){ case KB_S_N_DOWN: putimage(545,1+row*25,buf_curse,XOR_PUT); if(row==item_num-1) row=0; else row+=1; putimage(545,1+row*25,buf_curse,XOR_PUT); break; case KB_S_N_UP: putimage(545,1+row*25,buf_curse,XOR_PUT); if(row==0) row=item_num-1; else row-=1; putimage(545,1+row*25,buf_curse,XOR_PUT); break; case KB_S_N_ENTER: done=TRUE; /*then......*/ break; case KB_S_N_F1: switch(row){ case 0: MessageBox("Drawing with the mouse."; break; case 1: MessageBox("Make all empty."; break; case 2: MessageBox("MS-DOS and press exit return."; break; case 3: MessageBox("Quit and return to MS-DOS."; break; case 4: MessageBox("Do you here that?"; break; case 5: MessageBox("C program made by XuJiwei in 23rd,Sep,2000."; break; } break; case KB_S_N_D: if(row!=0) { putimage(545,1+row*25,buf_curse,XOR_PUT); row=0; putimage(545,1+row*25,buf_curse,XOR_PUT); } done=TRUE; break; case KB_S_N_A: if(row!=5) { putimage(545,1+row*25,buf_curse,XOR_PUT); row=5; putimage(545,1+row*25,buf_curse,XOR_PUT); } done=TRUE; getch(); break; case KB_S_N_S: if(row!=4) { putimage(545,1+row*25,buf_curse,XOR_PUT); row=4; putimage(545,1+row*25,buf_curse,XOR_PUT); } done=TRUE; break; case KB_S_N_C: /*there appears a bug*/ if(row!=1) { putimage(545,1+row*25,buf_curse,XOR_PUT); row=1; putimage(545,1+row*25,buf_curse,XOR_PUT); } done=TRUE; break; case KB_S_N_M: if(row!=2) { putimage(545,1+row*25,buf_curse,XOR_PUT); row=2; putimage(545,1+row*25,buf_curse,XOR_PUT); } done=TRUE; break; case KB_S_N_Q: if(row!=3) { putimage(545,1+row*25,buf_curse,XOR_PUT); row=3; putimage(545,1+row*25,buf_curse,XOR_PUT); } done=TRUE; break; default: break; } }while(!done); return row; /*useful*/ } int get_key() /*receive the keyboard massage*/ { union REGS rg; rg.h.ah=0; int86(0x16,&rg,&rg); /*?*/ return rg.h.ah; } Mouse() { int buttons,x,y; setcolor(YELLOW); outtextxy(5,15,"Move mouse using any button,click Quit to quit."; setcolor(WHITE); setwritemode(XOR_PUT); if(init(WindowMinY,WindowMaxX,WindowMinX,458)==0) { /*init() :a function defined*/ printf("Mouse or mouse driver absent,please install it!"; delay(5000); exit(1); } x=320; y=240; cursor(x,y); for(;{ newxy(&x,&y,&buttons); if(x>=548&&x=85&&y0){ cursor(xx0,yy0); cursor(xm,ym); } else{ cursor(xx0,yy0); cursor(xm,ym); circle(xm,ym,2); } *mx=xm; *my=ym; } void MessageBox(char *Message) { int MidX,MidY,x1,y1,x2,y2,size,Len; void *Buffer; MidX=(WindowMaxX-WindowMinX)/2; MidY=(WindowMaxY-WindowMinY)/2; Len=8*(strlen(Message)+1)/2; x1=MidX-Len-5*8; x2=MidX+Len+5*8; y1=MidY-50; y2=MidY+50; size=imagesize(x1,y1,x2,y2); if((Buffer=malloc(size))==NULL){ outtextxy(100,300,"Out of memorry!Press any key to continue."; getch(); } else{ getimage(x1,y1,x2,y2,Buffer); setfillstyle(SOLID_FILL,BLUE); bar(x1,y1,x2-13,y2-13); setfillstyle(SOLID_FILL,BLACK); bar(x1+12,y2-12,x2,y2); bar(x2-12,y1+12,x2,y2); setcolor(GREEN); settextjustify(CENTER_TEXT,CENTER_TEXT); settextstyle(1,0,1.5); outtextxy(MidX,MidY-20,Message); setcolor(YELLOW); outtextxy(MidX,MidY+2,"ALL RIGHTS RESERVED."; setcolor(RED); outtextxy(MidX,MidY+26,"2000-09-23"; getch(); putimage(x1,y1,Buffer,COPY_PUT); free(Buffer); settextjustify(LEFT_TEXT,TOP_TEXT); } } /******************************end*****************************//




欢迎大家观临我的个人主页: dosdiy.bluepc.com.cn/ dosdiy.ys168.com/ EMAIL: lydong@china.com.cn lydong@yeah.net ----------------------------------------------
2003-4-1 00:00
查看资料  发送邮件  访问主页  发短消息  网志  OICQ (89677127)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: