vb编程乐园吧 关注:33贴子:329
  • 4回复贴,共1

用VB编写“红绿灯”程序

只看楼主收藏回复

第一件事当然是新建一个工程,然后引入所需控件。在“红绿灯”程序中,我们需要用到的控件有:OptionButton(选项按钮)、Image(图像框)及Timer(时钟)控件。引入两个OptionButton,其中Option1的Caption设置为“红灯”,Option2的Caption设置为“绿灯”;Image1的Picture属性设置为红灯图片,选择一张红灯图片(读者可以自己创建一个红灯及绿灯图片)。设计好的程序界面如图1。

  好了,现在我们开始添加程序代码。

  我们要求程序能够通过我们所选择的是红灯或绿灯来显示相应的图像,实现的原理就是当我们单击“红灯”时显示红灯图片,单击“绿灯”时显示绿灯图片,只要用户准备好这两张图片后,要实现这个功能就非常的容易了。其具体的程序代码如下:


  双击Option1(即红灯)控件,添加如下代码:(黑体部分为系统自动生成的代码,下同)
   Private Sub Option1_Click()
   ′显示红灯图片
   On Error GoTo LoadErr ′当载入图片发生错误时跳到LoadErr处
   If Option1.Value=True Then ′当单击了Option1控件时
   Image1.Picture=LoadPicture(〃C:\Windows\Desktop\red.jpg〃) ′载入red.jpg图片,并显示在Image1控件中。
   End If
   LoadErr: ′设置捕获错误标签
   If Err.Number=53 Then ′当发生错误时
    MsgBox Err.Description,vbOKOnly+vbCritical,〃错误〃 ′显示错误信息
   End If
   End Sub 

  上面一段代码中有一句“On Error Goto LoadErr”,该句是用作捕获程序错误的,当程序执行过程中发生了错误则跳到处理错误语句处执行。在这段代码中,如果在载入图片时发生了错误(通常是所要载入的文件不存在或路径错误)则跳到LoadErr处执行LoadErr后的程序代码。

  在VB中,所有的程序错误都是用数字表示的,如53则表示未找到文件的错误码,其实要知道哪个错误码表示哪种错误也并不难,当你在VB中运行这个程序时,如果出现了错误,会有一个错误的提示框,在该提示框中则有该错误的错误码。如果我们没有在该段程序中加入“On Error Goto LoadErr”语句及给出错误的文件名或文件路径的话,则会出现如图2所示的提示框。

  LoadPicture是载入图片的函数,其中第一个参数则是所要载入图片的完整路径,当然在本例中这个路径是固定了的,所要想使其路径随程序路径的变化而变化则需要使用App.Path值,可以写成Image1.Picture=LoadPicture(App.Path&〃\red.jpg〃),其中App.Path返回的值则是程序所在的路径,当然red.jpg必须放在程序所在的同一目录中。

  双击Option2(即绿灯)控件,添加如下代码:


  Private Sub Option2_Click()
   ′显示绿灯图片
   On Error GoTo LoadErr ′当载入图片发生错误时跳到LoadErr处
   If Option2.Value=True Then ′当单击了Option2控件时
   Image1.Picture=LoadPicture(〃C:\Windows\Desktop\green.jpg〃) ′载入green.jpg图片,并显示在Image1控件中。
   End If
   LoadErr: ′设置标签
   If Err.Number=53 Then ′当发生错误时
    MsgBox Err.Description,vbOKOnly+vbCritical,〃错误〃 ′显示错误信息
   End If
   End Sub 


  OK!现在我们就可以单击F5键运行一下,看看我们自制的“红绿灯”程序吧。点击一下“绿灯”看看,红灯变成绿灯了吧?再试试红灯,怎样?现在我们就可以控制红绿灯了吧。

  如何才能让“红绿灯”自动更换呢?要实现这个功能也非常简单,只要加入Timer(时钟)控件,将Timer1的Interval设置为3000(即3秒)。其原理就是每隔3秒更换一种图片,这样便实现了自动更换。

  双击Timer1控件,添加如下代码:


  Private Sub Timer1_Timer()
   ′实现自动化
   If Option1.Value=True Then ′如果当前显示的是红灯
    Option2.Value=True ′使Option2被选中,执行Option2中的代码(即显示绿灯)
   Else
    Option1.Value=True ′使Option1被选中,执行Option1中的代码(即显示红灯)
   End If
   End Sub 




1楼2007-05-23 11:58回复
    • 222.223.40.*
    /************************************************************************/
    /* */
    /************************************************************************/
    #include "Conio.h"
    #include <bios.h>
    #include <dos.h>
    #include <stdio.h>
    #include <stdlib.h>
    int char_v,scan_v,second;
    int main(void)
    {
     int i,k1,k2,old_sec=0;
     int run_tm1,run_tm2,green,yellow,red,cross,stop;
     /* tm1: zuo-green
     tm2: yellow
     tm3: zhi-green
     tm4: hong
     tm5: offset
     */
    clear(0x3f);
    draw_2border(4,25,21,54,0,0x1f);
    select:;
     scroll(5,20,26,54,0x3f,16,6);
     write_s(" Select Item",0x3f,6,33);
     write_s("=================",0x3f,7,33);
     write_s("1. One Chanel",0x3f,9,33);
     write_s("2. Three Chanel",0x3f,10,33);
     write_s("Please Select: ",0x3f,12,33);
     char_v=read_char();
     if(char_v=='1') { write_char('1',0x3f); goto run1;}
     if(char_v=='2') { write_char('2',0x3f); goto run3;}
     if(char_v==27) { if(Exit_sys()==1) goto end;}
     goto select;
    run1:;
     scroll(5,20,26,54,0x3f,16,6);
     green=9;
     yellow=4;
     cross=2; /* 红灯同亮2倍cross */
     stop=green+4*cross;
     run_tm1=2*cross;
     run_tm2=stop;
     k1=0;k2=0;
     scan_v=0;
    write_ch('X',0x3c,6,40);
    write_ch('X',0x3c,20,40);
    write_ch('X',0x3c,13,29);
    write_ch('X',0x3c,13,52);
    while(1)
    {
     if (kbhit() != 0 && get_key(&scan_v) ==27){ goto select;}
     disp_time();
     if (old_sec!=second)
     { old_sec=second;
     run_tm1--;
     if(run_tm1<0) {k1++;if (k1>2) k1=1;}
     if(run_tm1<0 && k1==1) run_tm1=green-1;
     if(run_tm1<0 && k1==2) run_tm1=stop-1;
     goto_xy(5,39);printf("%2d",run_tm1);
     if(k1==1){if(run_tm1>yellow-1)write_ch('O',0x3a,6,40);
     else write_ch('O',0x3e,6,40);}
     if(k1==2){write_ch('X',0x3c,6,40);}
     goto_xy(19,39);printf("%2d",run_tm1);
     if(k1==1){if(run_tm1>yellow-1)write_ch('O',0x3a,20,40);
     else write_ch('O',0x3e,20,40);}
     if(k1==2){write_ch('X',0x3c,20,40);}
    /* 对方 */
     run_tm2--;
     if(run_tm2<0) {k2++;if (k2>2) k2=1;}
     if(run_tm2<0 && k2==1) run_tm2=green-1;
     if(run_tm2<0 && k2==2) run_tm2=stop-1;
    


    2楼2009-02-28 16:52
    回复
      • 222.223.40.*

       goto_xy(12,28);printf("%2d",run_tm2);
       if(k2==1){if(run_tm2>yellow-1)write_ch('O',0x3a,13,29);
       else write_ch('O',0x3e,13,29);}
       if(k2==2){write_ch('X',0x3c,13,29);}
       goto_xy(12,51);printf("%2d",run_tm2);
       if(k2==1){if(run_tm2>yellow-1)write_ch('O',0x3a,13,52);
       else write_ch('O',0x3e,13,52);}
       if(k2==2){write_ch('X',0x3c,13,52);}
      /*
       goto_xy(22,18);printf("Key=%03d Green=%d Yellow=%d Red=%d Cross=%d Stop=%d",scan_v,green,yellow,red,cross,stop);
      */
       }
       if (scan_v==19){goto run1;}
       goto_xy(0,79);
      }
      goto end;
      run3:;
       scroll(5,20,26,54,0x3f,16,6);
       green=9;
       yellow=4;
       red=8;
       cross=2; /* 红灯同亮2倍cross */
       stop=green+red+4*cross;
       run_tm1=2*cross;
       run_tm2=stop;
       k1=0;k2=0;
       scan_v=0;
       write_ch('X',0x3c,6,38);write_ch('X',0x3c,6,40);write_ch('O',0x3a,6,42);
       write_ch('X',0x3c,20,38);write_ch('X',0x3c,20,40);write_ch('O',0x3a,20,42);
       write_ch('X',0x3c,13,27);write_ch('X',0x3c,13,29);write_ch('O',0x3a,13,31);
       write_ch('X',0x3c,13,49);write_ch('X',0x3c,13,51);write_ch('O',0x3a,13,53);
      while(1)
      {
       if (kbhit() != 0 && get_key(&scan_v) ==27){ goto select;}
       disp_time();
       if (old_sec!=second)
       { old_sec=second;
       run_tm1--;
       if(run_tm1<0) {k1++;if (k1>3) k1=1;}
       if(run_tm1<0 && k1==1) run_tm1=green-1;
       if(run_tm1<0 && k1==2) run_tm1=red-1;
       if(run_tm1<0 && k1==3) run_tm1=stop-1;
       goto_xy(5,39);printf("%2d",run_tm1);
       if(k1==1){if(run_tm1>yellow-1)write_ch('O',0x3a,6,38);
       else write_ch('O',0x3e,6,38);}
       if(k1==2){write_ch('X',0x3c,6,38);
       if(run_tm1>yellow-1)write_ch('O',0x3a,6,40);
       else write_ch('O',0x3e,6,40);}
       if(k1==3){write_ch('X',0x3c,6,40);}
       goto_xy(19,39);printf("%2d",run_tm1);
       if(k1==1){if(run_tm1>yellow-1)write_ch('O',0x3a,20,38);
       else write_ch('O',0x3e,20,38);}
       if(k1==2){write_ch('X',0x3c,20,38);
       if(run_tm1>yellow-1) write_ch('O',0x3a,20,40);
       else write_ch('O',0x3e,20,40);}
       if(k1==3){write_ch('X',0x3c,20,40);}
      /* 对方 */
       run_tm2--;
       if(run_tm2<0) {k2++;if (k2>3) k2=1;}
       if(run_tm2<0 && k2==1) run_tm2=green-1;
       if(run_tm2<0 && k2==2) run_tm2=red-1;
       if(run_tm2<0 && k2==3) run_tm2=stop-1;
       goto_xy(12,28);printf("%2d",run_tm2);
       if(k2==1){if(run_tm2>yellow-1)write_ch('O',0x3a,13,27);
       else write_ch('O',0x3e,13,27);}
       if(k2==2){write_ch('X',0x3c,13,27);
       if(run_tm2>yellow-1) write_ch('O',0x3a,13,29);
       else write_ch('O',0x3e,13,29);}
       if(k2==3){write_ch('X',0x3c,13,29);}
       goto_xy(12,50);printf("%2d",run_tm2);
       if(k2==1){if(run_tm2>yellow-1)write_ch('O',0x3a,13,49);
       else write_ch('O',0x3e,13,49);}
       if(k2==2){write_ch('X',0x3c,13,49);
       if(run_tm2>yellow-1) write_ch('O',0x3a,13,51);
       else write_ch('O',0x3e,13,51);}
       if(k2==3){write_ch('X',0x3c,13,51);}
      /*
       goto_xy(22,18);printf("Key=%03d Green=%d Yellow=%d Red=%d Cross=%d Stop=%d",scan_v,green,yellow,red,cross,stop);
      */
       }
       if (scan_v==19){goto run3;}
       goto_xy(0,79);
      }
      end:;
       return 0;
      }


      3楼2009-02-28 16:52
      回复
        • 222.223.40.*
         if (week==6) printf("六");
         */
         goto_xy(x1,y1);
         old_time=time;
         }
         }
        }
        /*********************************************************/
        /* clear() SUBPROGRAM FOR CLEAR THE SCREEN */
        /*********************************************************/
         clear(int attr)
         {
         union REGS regs1;
         regs1.x.ax = 0x0600;
         regs1.h.bh = attr;
         regs1.h.bl = 0x00;
         regs1.x.cx = 0x0000;
         regs1.x.dx = 0x184f;
         int86(0x10,®s1,®s1);
         }
        /***********************************************************/
        /* READ_XY(LINE,COLUMN) */
        /* PROGRAM FOR READ THE SITE OF SRCP */
        /***********************************************************/
        read_xy(line,column)
        int *line,*column;
        {
         union REGS reg;
         reg.h.ah = 0x03;
         reg.h.bh = 0x0;
         int86(0x10,®,®);
         *line = reg.h.dh;
         *column = reg.h.dl;
        }
        /*****************************************************************/
        /* GOTO_XY(X,Y) SUBPROGRAM FOR SEND THE CURSOR TO X,Y */
        /*****************************************************************/
         goto_xy(x,y)
         int x,y;
         {
         union REGS r;
         r.h.ah=2; /* cursor adressing function */
         r.h.dl=y; /* column coordinate */
         r.h.dh=x; /* row coordination */
         r.h.bh=0; /* vidio page */
         int86(0x10,&r,&r);
         }
        /*************************************************************************/
        /* GET_KEY(...) SUBPROGRAM FOR READ THE 16_BIT SCAN CODE OF A KEY */
        /*************************************************************************/
        int get_key(scan_vv)
         int *scan_vv;
         {
         union REGS r;
         int c_v;
         r.h.ah=0;
         int86(0x16,&r,&r);
         *scan_vv=r.h.ah;
         c_v=r.h.al;
         return(c_v);
         }
        /**********************************************************/
        /* display a string with specified attribute */
        /***********************************************************/
        write_s(char p[],int attrib,int x,int y)
        {
         union REGS r;
         register int i,j;
         int x_x,y_y;
         j=0;
         for(i=y;p[j];i++) {
         goto_xy(x,i);
         r.h.ah=9;
         r.h.bh=0;
         r.x.cx=1;
         r.h.al=p[j];
         r.h.bl=attrib;
         j++;
         int86(0x10,&r,&r);
        


        5楼2009-02-28 17:05
        回复
          • 222.223.40.*
           }
           read_xy(&x_x,&y_y);
           if (y_y>79) goto_xy(x_x+1,0);
           else goto_xy(x_x,y_y+1);
           }
          /********************************************************************/
          /* CHAR READ_CHAR() SUBPROGRAM FOR CALL THE CHECK BUFFER */
          /* SUBPROGRAMS. WHEN THE K.B. IS HITED IT WILL GO TO TREAT IT */
          /* AND RETURN THE K.B. VALUE. */
          /********************************************************************/
           int read_char()
           {
           while (kbhit() == 0) disp_time();
           char_v=get_key(&scan_v);
           if (char_v!=0) scan_v=0;
           return(char_v);
           }
           /*************************************************************************/
          /* WRITE_CHAR(...) SUBPROGRAM FOR DISPLAY A CHAR IN A SPECIFIED */
          /* ATTRIBUTE */
          /*************************************************************************/
          write_char(int c,int attrib)
           {
           union REGS r;
           int line,column;
           r.h.ah=9; /* write character function */
           r.h.bh=0; /* assume active display page is 0 */
           r.x.cx=1; /* number of times to write the character */
           r.h.al=c; /* character */
           r.h.bl=attrib; /* attribute */
           int86(0x10,&r,&r);
           read_xy(&line,&column);
           goto_xy(line,column+1);
           }
          /*****************************************/
          /* */
          /*****************************************/
          draw_2border(startx,starty,endx,endy,mid,attr)
           int startx,starty,endx,endy,mid,attr;
           {
           int i;
           write_s("?,attr,startx,starty);
           write_s("?,attr,endx,starty);
           write_s("?,attr,startx,endy+1);
           write_s("?,attr,endx,endy+1);
           for (i=starty+1;i<endy+1;i++)
           {
           write_s("?,attr,startx,i);
           write_s("?,attr,endx,i);
           }
           for (i=startx+1;i<endx;i++)
           {
           write_s("?,attr,i,starty);
           write_s("?,attr,i,endy+1);
           }
          if (mid!=0)
           {
           write_s("?,attr,mid,starty); /* ?*/
           write_s("?,attr,mid,endy+1); /* ?*/
           for (i=starty+1;i<endy+1;i++)
           write_s("?,attr,mid,i); /* ?*/
           }
           }
          /*******************************************/
          /* ERROR FOR PRINT HELP MESSAGE */
          /******************************************/
          mess_string(str00,attrib,x,y)
          int attrib;
          int x;
          int y;
          char *str00;
          {
           int xx_1,yy_1,lenth,i;
           read_xy(&xx_1,&yy_1);
           if (y!=-1)
           { goto_xy(x,y);
           for (i=y;i<80-y;i++) write_char(' ',attrib);
           }
           lenth=strlen(str00);
           write_s(str00,attrib,x,(80-lenth)/2);
           goto_xy(xx_1,yy_1);
          }
          /***************************************************************/
          /* SCROLL() SCROLL A PORTION OF THE SCREEN '0'向下滚动 */
          /***************************************************************/
           scroll(startx,endx,starty,endy,attr,num,s_dir)
           int startx,endx,starty,endy,attr,num,s_dir;
           {
           union REGS r;
           r.h.ah=s_dir; /* screen scroll dir */
           r.h.al=num; /* 0 -- clear screen code */
           r.h.ch=startx; /* start row */
           r.h.cl=starty; /* start column */
           r.h.dh=endx; /* end row */
           r.h.dl=endy; /* end column */
           r.h.bh=attr;
           int86(0x10,&r,&r);
           }


          6楼2009-02-28 17:05
          回复