Thứ Sáu, 14 tháng 3, 2014

[C++] Code tạo giao diện menu trên Borland C


Chào các bạn!
Mình xin giới thiệu cho các bạn biết về cách để 1 chương trình C++ của bạn có thể nhận click chuột.
Có nhiều dạng code để làm được việc đó. Mình chia sẻ một cách đơn giản sau:
Chương trình của chúng ta sẽ gồm 2 nút bấm. Các bạn sẽ đưa chuột và click vào đấy, chương trình sẽ thực hiện chức năng tương ứng.
Các bước thực hiện

i.              Hàm hiển thị nút bấm:
void Mouse::Show()
{
                int x=20,y=10;
                gotoxy(25,5); textcolor(10);
                cprintf("YOU HAS TWO BUTTON");
    VarButton(BUTTON1,"[   BUTTON1   ]",x,y);
    VarButton(BUTTON2,"[   BUTTON2   ]",x+20,y);
    ShowButton(BUTTON1);
    ShowButton(BUTTON2);
}
ii.             Hàm xác nhận click chuột:
void Mouse::EnterClick()
{
                do
                {
                                MOUSE_THERE=1;
                                if(kbhit()) getch();
                                get_mouse_button(&lbutton,&rbutton,&xmouse,&ymouse);
                }while(lbutton==0);
}
iii.            Hàm phân loại click cho từng chức năng thiết kế:
Mouse::Click()
{
                MOUSE_THERE=0;
                if(ClickButton(BUTTON1,xmouse,ymouse))
                                                {
                                                     EffectClick(BUTTON1)    return 1;
                                                }
                if(ClickButton(BUTTON2,xmouse,ymouse))
                                                {
                                                        EffectClick(BUTTON2)    return 2;
                                                }                             
   return 3;
}
iv.           Chức năng người dùng thiết kế:
void Mouse::Program()
{
                switch(Click())
                {
                case 1:
                clrscr();
                gotoxy(20,10); textcolor(10);
                cprintf("YOU HAVE CLICK ON BUTTON 1. ENTER TO CONTINUE");
                getch();
                gotoxy(20,10);clreol();
                break;
                case 2: 
                clrscr();
                gotoxy(20,10); textcolor(10);
                cprintf("YOU HAVE CLICK ON BUTTON 2. ENTER TO EXIT");
                getch();
                gotoxy(20,10);clreol();
                exit(1);
                break;
                }
}
v.            Menu:
[CODE=C++]void Mouse::Menu()
{
                while(1)
                {
                                 Show();
                                EnterClick();
                                Program();
                }
}
OK, vậy là xong các hàm rồi nha, các bạn cứ đọc từ từ sẽ hiểu thôi, cũng không khó lắm nhỉ?
                Code:
include<string.h>
#include<stdlib.h>
#include<dos.h>
#include"button.ta"
#include<iostream.h>
#include"mouse.inc"
/*----------------------Dinh_Nghia_Doi_Tuong-------------------------------*/
class Mouse
{
    private:
    Button BUTTON1,BUTTON2;
    public:
    void Show();
    void EnterClick();
    int Click();
    void Program();
    void Menu();
};
/*-------------------Hien_Thi_Cac_Nut_Bam----------------------------------*/
void Mouse::Show()
{
    int x=20,y=10;
    gotoxy(25,5); textcolor(10);
    cprintf("YOU HAS TWO BUTTON");
    VarButton(BUTTON1,"[   BUTTON1   ]",x,y);
      VarButton(BUTTON2,"[   BUTTON2   ]",x+20,y);
      ShowButton(BUTTON1);
    ShowButton(BUTTON2);
}
/*---------------------Nhan_Click_Chuot------------------------------------*/
void Mouse::EnterClick()
{
    do
    {
        MOUSE_THERE=1;
        if(kbhit()) getch();
        get_mouse_button(&lbutton,&rbutton,&xmouse,&ymouse);
    }while(lbutton==0);
}
/*-----------------------Phan_Loai_Click-----------------------------------*/
int Mouse::Click()
{
    MOUSE_THERE=0;
    if(ClickButton(BUTTON1,xmouse,ymouse))
            {
                EffectClick(BUTTON1);/*sau khi click chuot thi doi mau khac*/      
                return 1;
            }
    if(ClickButton(BUTTON2,xmouse,ymouse))
            {
                EffectClick(BUTTON2);/*sau khi click chuot thi doi mau khac*/      
                return 2;
            }      
            return 3;
}
/*------------------------Cac_Chuc_Nang_Cua_Chuong_Trinh-------------------*/
void Mouse::Program()
{
    switch(Click())
    {
        case 1:
            clrscr();
            gotoxy(20,10); textcolor(10);
            cprintf("YOU HAVE CLICK ON BUTTON 1. ENTER TO CONTINUE");
            getch();
            gotoxy(20,10);clreol();
            break;
        case 2:
            clrscr();
            gotoxy(20,10); textcolor(10);
            cprintf("YOU HAVE CLICK ON BUTTON 2. ENTER TO EXIT");
            getch();
            gotoxy(20,10);clreol();
            exit(1);
            break;
        }
}
/*--------------------------Menu_Chinh-------------------------------------*/
void Mouse::Menu()
{
    while(1)
    {
        Show();
        EnterClick();
        Program();
    }
}
/*---------------------------Chuong_Trinh_Chinh----------------------------*/
int main()
{
    Mouse ob;
    ob.Menu();
    return 0;
}
/*------------------------------The_End------------------------------------*/
[/CODE]
Trong chương trình trên, bạn sử dụng 2 thư viện tự tạo, đó là:
[CODE=C++]#include"button.ta"
#include"mouse.inc"

Đoạn code của các thư viện như sau:
button.ta:
include<stdio.h>
#include<conio.h>
typedef struct
{
                int xbutton;
                int ybutton;
                char *name;
                int statusbutton;
}Button;
void VarButton(Button &B,char *s,int x,int y)
{
                B.xbutton=x;
                B.ybutton=y;
                B.statusbutton=1;
                B.name=s;
}
void ShowButton(Button B)
{
   if(B.statusbutton==1)
   {
                textbackground(15);
                gotoxy(B.xbutton,B.ybutton);textcolor(LIGHTRED);cprintf("%s",B.name);
                textbackground(BLACK);
                }
}
void EnableButton(Button& B)
{
    B.statusbutton=1;
}
void DisableButton(Button& B)
{
                textbackground(15);
                gotoxy(B.xbutton,B.ybutton);textcolor(LIGHTGRAY);cprintf("%s",B.name);
                B.statusbutton=0;
                textbackground(BLACK);
}
int ClickButton(Button B,int xchuot,int ychuot)
{
                if(B.statusbutton==1)
                {
                                if(xchuot>=(B.xbutton-1)*8&&xchuot<=(B.xbutton+strlen(B.name)-1-1)*8&&ychuot==(B.ybutton-1)*8)
                                return 1;
                }
                return 0;
}
void EffectClick(Button B)
{
                gotoxy(B.xbutton,B.ybutton);textcolor(LIGHTCYAN+BLINK);cprintf("%s",B.name);
                delay(200);
                ShowButton(B);
}
void EffectClickNonButton(int x,int y)
{
                gotoxy(x,y);textbackground(WHITE);textcolor(WHITE);cprintf(".");
                textbackground(BLACK);
                delay(200);
}

mouse.inc:
define MV_LBUTTON 1
#define MV_RBUTTON 2
#define MV_BBUTTON 3

int NUMBER_BUTTONS = 2;
int MOUSE_SIZE = 16;

unsigned char MOUSE_THERE;
unsigned char MOUSE_VISIBLE;

unsigned char LBUTTON_DOWN,
                                                  RBUTTON_DOWN,
                                                  BBUTTON_DOWN,
                                                  LBUTTON_UP,
                                                  RBUTTON_UP,
                                                  BBUTTON_UP,
                                                  CURSOR_MOVED;

int CMX = 0,
    CMY = 0;
int BSTATE = 0;

union REGS mregs;
struct SREGS msegregs;

unsigned char EGA_REG_READ = 1;
unsigned char lbutton, rbutton;
int xmouse, ymouse;

void reset_mouse()
{
  MOUSE_THERE = 0;
  MOUSE_SIZE = 16;
  MOUSE_VISIBLE = 0;
  if (getvect(0x33) != 0L)
  {
                mregs.x.ax = 0;
                int86(0x33, &mregs, &mregs);
                if (mregs.x.ax != 0)
                {
                  MOUSE_THERE = 1;
                  NUMBER_BUTTONS = mregs.x.bx;
                  LBUTTON_DOWN = 0;
                  RBUTTON_DOWN = 0;
                  BBUTTON_DOWN = 0;
                }
  }
}

void show_mouse()
{
  if (MOUSE_THERE)
  {
                mregs.x.ax = 1;
                int86(0x33, &mregs, &mregs);
                MOUSE_VISIBLE = 1;
  }
}

void hide_mouse()
{
  if (MOUSE_THERE && MOUSE_VISIBLE)
  {
                mregs.x.ax = 2;
                int86(0x33, &mregs, &mregs);
                MOUSE_VISIBLE = 0;
  }
}

void get_mouse_button(unsigned char *lbutton, unsigned char *rbutton, int *x, int *y)
{
  if (MOUSE_THERE)
  {
                mregs.x.ax = 3;
                int86(0x33, &mregs, &mregs);
                *lbutton = (mregs.x.bx == 1) ? 1 : 0;
                *rbutton = (mregs.x.bx == 2) ? 1 : 0;
                if (mregs.x.bx == 3)
                  *rbutton = *lbutton = 1;
                *x = mregs.x.cx;
                *y = mregs.x.dx;
  }
}

unsigned char get_button_rls_info(int butt_no, int *count, int *x, int *y)
{
  if (MOUSE_THERE)
  {
                  mregs.x.ax = 6;
                  mregs.x.bx = butt_no;
                  int86(0x33, &mregs, &mregs);
                  *count = mregs.x.bx;
                  *x = mregs.x.cx;
                  *y = mregs.x.dx;
    if (butt_no == 0)
      return (!(mregs.x.ax & 1));
    else
      return (!((mregs.x.ax & 2) >> 1));
  }
  return 0;
}

void set_event_handler(int call_mask, void (far *location)(void))
{
  if (MOUSE_THERE)
  {
                  mregs.x.ax = 12;
                  mregs.x.cx = call_mask;
                  mregs.x.dx = FP_OFF(location);
                  msegregs.es = FP_SEG(location);
                  int86(0x33, &mregs, &mregs);
  }
}

void set_hide_bound(int x1, int y1, int x2, int y2)
{
  if (MOUSE_THERE)
  {
                  mregs.x.ax = 16;
                  mregs.x.cx = x1;
                  mregs.x.dx = y1;
                  mregs.x.si = x2;
                  mregs.x.di = y2;
                  int86(0x33, &mregs, &mregs);
  }
}

void set_mouse_position(int x,int y)
{
  if (MOUSE_THERE)
  {
                  mregs.x.ax = 4;
                  mregs.x.cx = x;
                  mregs.x.dx = y;
                  int86(0x33, &mregs, &mregs);
  }
}

void set_mouse_hlimits(int x1,int x2)
{
  if (MOUSE_THERE)
  {
                  mregs.x.ax = 7;
                  mregs.x.cx = x1;
                  mregs.x.dx = x2;
                  int86(0x33, &mregs, &mregs);
  }
}

void set_mouse_vlimits(int y1,int y2)
{
  if (MOUSE_THERE)
  {
                  mregs.x.ax = 8;
                  mregs.x.cx = y1;
                  mregs.x.dx = y2;
                  int86(0x33, &mregs, &mregs);
  }
}

/*void far event_handler(void);

void near event_processor(int event_status, int button_status, int x, int y)
{
  if ((CMX != x) || (CMY != y))
  {
    CURSOR_MOVED = 1;
    CMX = x;
    CMY = y;
  }

  BSTATE = button_status;

  if (event_status & 2)
    LBUTTON_DOWN = 1;
  if (event_status & 8)
    RBUTTON_DOWN = 1;
  if (((event_status & 2) || (event_status & 8)) && (button_status == 3))
    BBUTTON_DOWN = 1;
  if ((NUMBER_BUTTONS == 3) && (event_status & 32))
    BBUTTON_DOWN = 1;
  if (event_status & 4)
    LBUTTON_UP = 1;
  if (event_status & 16)
    RBUTTON_UP = 1;
  if (LBUTTON_UP & RBUTTON_UP)
    BBUTTON_UP = 1;
  if ((NUMBER_BUTTONS == 3) && (event_status & 64))
    BBUTTON_UP = 1;
}

void reset_event_handler(void)
{
  CURSOR_MOVED = 0;
  LBUTTON_DOWN = LBUTTON_UP = 0;
  RBUTTON_DOWN = RBUTTON_UP = 0;
  BBUTTON_DOWN = BBUTTON_UP = 0;
}

void install_event_handler(void)
{
  if (NUMBER_BUTTONS == 3)
    set_event_handler(127, event_handler);
  else
    set_event_handler(31, event_handler);
}*/
Các bạn lưu 3 file trên vào mục BIN của BORLAND C, sau đó chạy thử để xem kết quả. Nếu bạn dùng WIN 7 thì bạn phải để BORLAND C vào mục cài win mới chạy được. Thường là ổ C. Sau đó bạn open with tệp menu và đặt mặc định mở các file code là BC trong BIN nhé!!
Hi vọng bài hướng dẫn này sẽ giúp các bạn hiểu hơn về cách thiết kế để chương trình C++ của các bạn nhận click chuột.
Các bạn xem thêm tại đây để hiểu thêm nhé:http://hocccoban.org/2014/11/29/c-code-tao-giao-dien-menu-tren-borland-c.html

Không có nhận xét nào:

Đăng nhận xét

Nhập nhận xét về bài viết của bạn vào ô dưới. Mình sẽ trả lời khi có thời gian :D