การติดตั้ง BGI library ใน CodeBlocks

การเขียนโปรแกรม

การติดตั้ง BGI library ใน CodeBlocks

clock
ในปัจจุบัน การเขียนโปรแกรม graphic คงเป็นเรื่องง่ายมากสำหรับโปรแกรมเมอร์รุ่นใหม่ๆ ด้วยประสิทธิภาพของเครื่องมือและอุปกรณ์ที่มีในปัจจุบันนี้ แต่ยังมีบางส่วนที่ต้องการ graphic แบบเก่าๆ อยู่ เช่น การแสดงผลบนอุปกรณ์ขนาดเล็ก หรือ ไม่เน้นการแสดงผลที่ละเอียดมากนัก หรือใช้ประสิทธิภาพของ CPU ที่ไม่สูงมากนัก

หากจะพูดถึงภาษาที่ใกล้กับภาษาเครื่องมากที่สุด คงต้องบอกว่าเป็น Assembly แต่มันยากไปไหม (หัวเราะ) งั้นก็ต้องมาลองดูกับภาษาซี วันนี้เลยจับมาลองกับโปรแกรม graphic (ผมเคยเขียนไว้บางแล้ว เรื่อง OpenGL) โดยลองใช้ library ทางฝั่งของ Borland บ้าง คือ Borland Graphics Interface (BGI)

 bgi 001

 ที่มา : https://www.abbreviations.com/images/88191_BGI.png

BGI โดยพื้นฐานนั้นทำงานบนระบบปฏิบัติการ DOS และต่อมาได้พัฒนาให้สามารถทำงานได้บนระบบปฏิบัติการ Windows ตั้งแต่ตัวแปลภาษาซีของ Borland 5.0 GNU C++
Code block เป็น IDE ที่ได้รับความนิยมในการพัฒนาโปรแกรมภาษาซีตัวหนึ่ง ผมจึงขอหยิบมานำเสนอว่า เราจะติดตั้งตัว BGI มาใช้ในงานของเราได้อย่างไร เริ่มเลยนะครับ

1. การติดตั้ง winBGIm library ใน CodeBlocks
Step 1: download ไฟล์ winBGIm.rar มาไว้ที่เครื่องคอมพิวเตอร์ 
Step 2: แตกไฟล์ จะได้รายการไฟล์ ดังนี้
• graphics.h
• winbgim.h
• linker_code.txt
• libbgi.a

Step 3: คัดลอกไฟล์ graphics.h และ winbgim.h ไปไว้ที่โฟลเดอร์ include ในตำแหน่งที่ติดตั้ง Code::Blocks เช่น
Drive C > Program files or Program files(x86) > CodeBlocks > MinGW > include

Step 4: คัดลอกไฟล์ libbgi.a ไปไว้ที่โฟลเดอร์ lib ในตำแหน่งที่ติดตั้ง Code::Blocks เช่น
Drive C > Program files or Program files(x86) > CodeBlocks > MinGW > lib

Step 5: เปิดโปรแกรม Code::Blocks. แล้วไปที่เมนู Settings > Compiler > Linker settings
Step 6: คลิกปุ่ม Add ที่แทป "Link libraries" และ browse ไปยังตำแหน่งที่เก็บ libbgi.a ในขั้นตอนที่ 4

 bgi 002

  

Step 7: ที่ช่อง "Other linker option" ให้คัดลอกข้อความ หรือพิมพ์ใหม่ลงไปในช่องวาง

-lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32


แล้วคลิกปุ่ม OK

 bgi 003

  

2. ทดสอบการทำงานของโปรแกรม
เมื่อติดตั้ง BGI แล้ว เรามาลองทดสอบโปรแกรม graphic กัน ขอยกตัวอย่างง่ายๆ คือการสร้างภาพนาฬิกาซักเรือนก็แล้วกันครับ download bgiclock.cpp

เปิด Code block แล้วสร้างไฟล์ภาษาซี ชื่อ bgiclock.cpp แล้วคัดลอกคำสั่งต่อไปนี้ลงไปได้เลย แต่ถ้าขี้เกียจก็ download จาก link ด้านบนเลย

#include <stdio.h>

#include <graphics.h>

#include <stdlib.h>

#include <math.h>

#include <dos.h>

#include <time.h>

#define PI 3.147

void clockLayout(int centerx,int centery,int ww);

void hrHand(int centerx,int centery,int len,int hr,int mm);

void minHand(int centerx,int centery,int len,int mm);

void secHand(int centerx,int centery,int len,int ss);

time_t rawtime;

struct tm *info;

int main( void) {

    int errorcode;

    int wid1;

    int midx, midy;

    int hh,ii,sec,i,j,k;

     wid1 = initwindow(300, 300," ");

     //ตรวจสอบข้อผิดพลาดในการเรียกใช้งาน graphic

     errorcode=graphresult();

     if(errorcode!=grOk)     {

          printf("Error in graphics, code= %d",grapherrormsg(errorcode));

          exit(0);

     }

     while(1) {

          cleardevice();

            // get GMT time

           time(&rawtime);

           info = gmtime(&rawtime );

           setcolor(1);

           setbkcolor(7);

           midx=150;

           midy=150;

            //calculate time1

           hh = (info->tm_hour+7)%24;

           ii = info->tm_min;

           sec = info->tm_sec;

           if(ii>=60) {

                ii %=60;

                hh =(hh+1)%24;

           }

            clockLayout(midx,midy,120);

            hrHand(midx,midy,50,hh,ii);

            minHand(midx,midy,70,ii);

            secHand(midx,midy,90,info->tm_sec);

         setcolor(1);

        setbkcolor(7);

        delay(1000);

        }

return 0;

}

void clockLayout(int centerx,int centery,int ww) {

         int i,x,y,r;

         float j;

         int num[]={3,4,5,6,7,8,9,10,11,12,1,2};

          char str[10];

          setcolor(15);

          fillellipse(centerx,centery,ww+5, ww+10);

          setcolor(6);

          ellipse(centerx,centery, 0, 360, ww+5, ww+10);

         circle(centerx,centery,ww-40);

         circle(centerx,centery,5);

         setcolor(1);

         setbkcolor(15);

          settextstyle(3, HORIZ_DIR, 1);

           x=centerx+ww-20;y=centery;

            r=ww-10;

            i=0;

          for(j=PI/6;j<=(2*PI);j+=(PI/6))  {    // marking the hours for every 30 degrees //

            sprintf(str, "%d", num[i++]);

            outtextxy(x-8, y-8, str);

              x=centerx+r*cos(j);

              y=centery+r*sin(j);

         }

         x=centerx+ww-30;y=centery;

         r=ww-30;

         setcolor(RED);

         for(j=PI/30;j<=(2*PI);j+=(PI/30)) {  // marking the minutes for every 6 degrees //

            pieslice(x,y,0,360,2);

             x=centerx+r*cos(j);

             y=centery+r*sin(j);

         }

}

void hrHand(int centerx,int centery,int len,int hr,int mm) {

     int r=len;

     int x,y;

     float O;

     x=centerx,y=centery;

     /* determining the angle of the line with respect to vertical */

     if(hr<=12)O=(hr*(PI/6)-(PI/2))+((mm/12)*(PI/30));

     if(hr>12) O=((hr-12)*(PI/6)-(PI/2))+((mm/12)*(PI/30));

     setcolor(1);

     line(centerx,centery,x+r*cos(O),y+r*sin(O));

}

void minHand(int centerx,int centery,int len,int mm) {

         int r=len;

         int x,y;

         float O;

         x=centerx;

         y=centery;

         O=(mm*(PI/30)-(PI/2)); /* determining the angle of the line with respect to vertical */

         setcolor(5);

         line(centerx,centery,x+r*cos(O),y+r*sin(O));

}

void secHand(int centerx,int centery,int len,int ss) {

         int r=len;

         int x,y;

         float O;

         x=centerx;

         y=centery;

         O=(ss*(PI/30)-(PI/2)); /* determining the angle of the line with respect to vertical */

         setcolor(4);

         line(centerx,centery,x+r*cos(O),y+r*sin(O));

}

เมื่อ compile แล้ว ไม่มีข้อผิดพลาด แล้วทดสอบการทำงานโปรแกรม จะได้หน้าต่างประมาณนี้

 bgi 000

  

เป็นอย่างไรบ้างครับ น่าจะพอมองเห็นภาพ และสามารถนำไปประยุกต์ใช้งานต่อไปได้นะครับ แล้วว่างๆ ผมจะมาลองทำโปรแกรม graphic ที่สามารถประยุกต์ไปใช้งานได้ เช่น การทำกราฟแสดงผลการทำงานของอุปกรณ์ต่างๆ เช่น การวัดความร้อน ความชื้น เป็นต้น ขอให้สนุกกับการเขียนโปรแกรมนะครับ

 

Add comment

Security code
Refresh