献给初学编程的礼物
2000-4-5
见过许多初学编程者不停地在询问什么编程语言好,怎样学编程。
从现在的学校考试、等级考试及水平资格考试来看,即使是window在流行,但考的内容
还是Dos编程。但实用软件却是window编程。
在这里我就两个简单的程序分别用C语言及VB在谈一下怎样编程.
一个规范的程序在用户手中首先接触的就是界面及操作方式,一个好的界面能给人以一
个美的享爱,不管是Dos程序还是window程序,一个好的操作方式能让用户习惯于操作这个程
序。
以下是怎样学习C语言(源程序请直接下载rosesnow.heha.net/software/zfxl.zip)
这个程序讲述的是一个简单的指法训练的例子
分析:要在屏幕上画出一个字母键盘,由计算机随机要求用户按下哪个键,用户要及时响应
,并计分。
我们书上所学的,考试所考的,都没有要求一个很好的界面,并且输入输出都是纯文本
界面(即25行,并且只有黑白两种)
而图形界面是按640*480点阵来的,window就是一个典形的图形界面),对于这个程序我将代
你进入dos下如何写图形界面的世界。
如果你对C语言一无所知请看一下书的基础内容,这里是讲一个编写的实例,所有的成果
都要经过自己动手写实例才能证实,学习别人写的实例是学习编程的最有效,也可以说是最
好的方法。(但以下程序必须对编程有个基础的了解,至少要知道三种程序结构、函数、过程
的含义,少数常用函数的使用)
首先我们要画出这个键盘
事实上编程是一点一点的来填充屏幕的,用到line(),setcolor()等函数
先来做一个按钮(这样函数请在main()中调用才可运行)
void ztu(int x1,int y1,int color) //没按时的
{ int i,n=4,x2,y2;
x2=x1+leng;y2=y1+leng;
setcolor(7);
setfillstyle(1,7);
bar3d(x1,y1,x2,y2,0,0);
for(i=1;i<n;i++)
{
setcolor(15);
line(x1+i,y1+i,x2-i,y1+i);
line(x1+i,y1+i,x1+i,y2-i);
setcolor(8);
line(x1+i,y2-i,x2-i,y2-i);
line(x2-i,y2-i,x2-i,y1+i);
}
}
void zou(int x1,int y1,int color) //按下去了的
{ int i,n=4,x2,y2;
x2=x1+leng;y2=y1+leng;
setcolor(7);
setfillstyle(1,7);
bar3d(x1,y1,x2,y2,0,0);
for(i=1;i<n;i++)
{
setcolor(8);
line(x1+i,y1+i,x2-i,y1+i);
line(x1+i,y1+i,x1+i,y2-i);
setcolor(15);
line(x1+i,y2-i,x2-i,y2-i);
line(x2-i,y2-i,x2-i,y1+i);
}
setcolor(color);
}
看到了吧,一个图形的界面就是这样的简单
把qwertyuiopasdfghjkl;zxcvbnm,./这些按钮按键盘放置在屏幕上
我们还可以引入BMP图像(16色,可以用画笔完成它)
函数如下(这个函可以以后用在你的程序中的,事实上很多程序就是这样抄来抄去的,不过
说一点这个方法是非常正确的,引用别人的程序是一个很好的学习、编写方法,可以节约时
间,提高效益,并且因为这些函数都十分经典,一般比自己写的都好一些)
int xs(int x,int y,char n[50])
{ int c1,c2=0,w1,ll,kuan,il,iw;
FILE *fp;
static int color[16]={0,4,2,6,1,5,3,7,8,12,10,14,9,13,11,15};
if ((fp=fopen(n,"rb"))==0)
{ printf("cannot open file\n");
return(0);}
fseek(fp,18,SEEK_SET);
fread(&kuan,4,1,fp);
w1=kuan;
fread(&kuan,4,1,fp);
ll=kuan;
fseek(fp,118,SEEK_SET);
for (il=0;il<ll;il++)
{ moveto(x,y+ll-il);
for(iw=0;iw<w1;iw++)
{ fread(&kuan,1,1,fp);
c1=(kuan & 0xf0) >>4;
if(c1!=c2 || iw==w1-1)
{ setcolor(color[c2]);
lineto(x+iw,y+ll-il);
c2=c1;}
iw++;
if(iw>=w1)continue;
c1=kuan & 0x0f;
if (c1!=c2 || iw==w1-1)
{ setcolor(color[c2]);
lineto(x+iw,y+ll-il);
c2=c1;
}}
for (iw=1;iw<(8-w1%8)%8;iw+=2)
fread(&kuan,1,1,fp);
} fclose(fp);
return (0);
}
用画图工具做一个16色背景,再把按钮放上去,这个程序的界面就完成了
这里反复地说到16色,为什么是16色,而不是256,16位真彩色呢,因为TC只提供了16色,当
然可以写出更多种颜色,但编起来要复杂得多。
我们还要在程序中运用汉字,记住Dos程序是一个西文环境,除非有ucdos等汉字平台的支持
,但我不赞成这种做法,不可能所有计算机上都装有这样的汉字平台,并且占用内存。下面
的函数是告诉你怎样在西文方式下写汉,同样地,你也可以在程序中引用这个函数。
int handle;
int openhzk()
{
handle=open("HZK16",0||5);
if(handle==-1)
{
cputs("error on open file!");
getch();
closegraph();
exit(1);
}
}
int puthz16(int x,int y,int z, int color,int m,int n,char * p)
{ unsigned int i,qu,wei,f=0;
int i1,i2,i3,i4,i5,rec,wordwi;
long relate;
char cbuf[32];
unsigned char tbuf[2];
settextstyle(SMALL_FONT,HORIZ_DIR,USER_CHAR_SIZE);
while((i=*p++)!=0)
{
if((i&128)==NULL){
setusercharsize(4*m,3,11*n,8);
tbuf[0]=i;
tbuf[1]=0;
setcolor(color);
outtextxy(x,y+8,tbuf);
setusercharsize(4,3,11,8);
x=x+8*m+z;
}
else{
if(i>=0xa1)
if(f==0)
{
qu=(i-0xa1)&0x07f;
f=1;
}
else
{
wei=(i-0xa1)&0x07f;
f=0;
rec=qu*94+wei;
relate=rec*32L;
lseek(handle,relate,SEEK_SET);
read(handle,cbuf,32);
for(i1=0;i1<16*m;i1=i1+m)
for(i4=0;i4<m;i4++)
for(i2=0;i2<2;i2++)
for(i3=0;i3<8;i3++)
if(getbit(cbuf[i1/m*2+i2],7-i3))
for(i5=0;i5<n;i5++)
putpixel(x+i2*8*n+i3+i5,y+i1+i4,color);
x=x+16+z;
}
}
}
return(x);
}
int getbit(unsigned char c,int n)
{
return((c>>n)&1);
}
不必太仔细的分析这几个函数,只要知道如何调用,怎样使用参数就行了。
以下是调用的实例。
openhzk();
puthz16(x1+17,y1+20,16,8,1,1," 指法训练");
close(handle);
(源程序请直接下载rosesnow.heha.net/software/zfxl.zip)
如果大家喜欢这篇文章,我将继续讲下去,请要求讲下去的读者回复一下。
::∴★∵**☆.∴★∵**☆
.█████.☆.∵★∵∴☆
.█田█田█.*☆.∴★∵
.█田█田█.★∵∴☆.★∵∴
.█田█田█.同一个星空下★..**
.█田█田█.望著天空的星星雨**☆
.█████.你可会想起我是你的好朋友?
◢██□██◣.此刻我送予你這一句“愿我们友谊永固”~~~~~*^_^*
::∴★∵**☆.∴★∵**☆