中国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*****************************//






欢迎大家观临我的个人主页:

      http://dosdiy.bluepc.com.cn/
      http://dosdiy.ys168.com/


EMAIL: lydong@china.com.cn    lydong@yeah.net
----------------------------------------------
2003-4-1 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (89677127)  编辑帖子  回复  引用回复

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


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



论坛跳转: