『楼 主』:
 转贴:用c语言做一个图形界面"程序"
 
使用 LLM 解释/回答一下
  
文章摘要:  
  这个小程序引用了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,""<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
setbkcolor(BLUE); 
cleardevice(); 
setcolor(YELLOW); 
setlinestyle(0,0,1); 
setfillstyle(1,5); 
settextstyle(1,0,9); 
circle(100,200,30); 
outtextxy(100,215,"Welcome!"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
floodfill(100,215,YELLOW); 
settextstyle(2,0,5); 
setcolor(WHITE); 
outtextxy(110,310,"press any key to continue..."<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
/*floodfill(110,310,BLACK);*/ 
settextstyle(3,0,2); 
outtextxy(180,450,"?2000 Awaresoft.All Rights Reserved."<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
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,""<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
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"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
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"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
outtextxy(548,35,"Clean"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
outtextxy(548,60,"Ms-DOS"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
outtextxy(548,85,"Quit"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; /*fill the four rectangles with words*/ 
outtextxy(548,110,"Sound"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
outtextxy(548,135,"About..."<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
/*added hot key*/ 
setcolor(LIGHTRED); 
outtextxy(548,10,"D"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
outtextxy(548,35,"C"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; /*cover the 'D' with another 'D'with a special color*/ 
outtextxy(548,60,"M"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
outtextxy(548,85,"Q"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;  
outtextxy(548,110,"S"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
outtextxy(548,135,"A"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
/*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(""<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; /*a lib function*/ 
goto MENU; 
case 3: 
/*quit*/ 
setcolor(WHITE); 
MessageBox("Made by XuJiwei."<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;/*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,"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
outtextxy(100,120,"there must be some bugs,I hope to commun"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
outtextxy(100,140,"-icate with you and kill them,and hope t "<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
outtextxy(100,160,"-o be your friend,for more information,p"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
outtextxy(100,180,"-lease write to #2140 HIT(zip code150001"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
outtextxy(100,200,"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">,or bill_e@sina.com"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
outtextxy(100,220," by XuJiwei,09-23-00."<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
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."<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
break; 
case 1: 
MessageBox("Make all empty."<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
break; 
case 2: 
MessageBox("MS-DOS and press exit return."<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
break; 
case 3: 
MessageBox("Quit and return to MS-DOS."<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
break; 
case 4: 
MessageBox("Do you here that?"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
break; 
case 5: MessageBox("C program made by XuJiwei in 23rd,Sep,2000."<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
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."<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
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!"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
delay(5000); 
exit(1); 
} 
x=320; 
y=240; 
cursor(x,y);  
for(;<img src="images/smilies/face-wink.png" align="absmiddle" border="0">{ 
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."<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
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."<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
setcolor(RED); 
outtextxy(MidX,MidY+26,"2000-09-23"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">; 
getch(); 
putimage(x1,y1,Buffer,COPY_PUT); 
free(Buffer); 
settextjustify(LEFT_TEXT,TOP_TEXT); 
} 
} 
/******************************end*****************************// 
 
  
 
 
    
 
  
  |