PDA

View Full Version : Thiết kế menu nhận click chuột trong C++



nang
20-09-2011, 04:17 PM
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.
Dao diện trông thế này:
http://farm3.anhso.net/upload/20110920/16/o/anhso-161008_2.jpg

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ế:

int 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:

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

Trong chương trình trên, bạn sử dụng 2 thư viện tự tạo, đó là:

#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);cp rintf("%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);c printf("%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+BL INK);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 BORLAN C, sau đó chạy thử để xem kết quả. Nếu bạn dùng WIN 7 thì bạn phải để BRLAN 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.
Code chương trình:
http://www.mediafire.com/?8i2ce7qw8a4nwbo
Cảm ơn các bạn đã theo dõi^^

nang
20-09-2011, 04:26 PM
Tiếp theo phần này, mình xin giới thiệu cách để chương trình của các bạn nhận bàn phím. Chương trình của chúng ta sẽ trông như sau:
http://farm3.anhso.net/upload/20110920/16/o/anhso-162426_3.jpg

Cách làm
Mình trình bày nguyên code của chương trình, trong đó đã có coment hướng dẫn chi tiết, nên các bạn cứ chầm chậm mà đọc nhé.

/*---------------------------Thiet_Ke_Menu_5_List--------------------*/
#include<string.h>
#include<stdlib.h>
#include<dos.h>
#include<iostream.h>
#define ListMax 5
/*---------------------------Khai_Bao_Doi_Tuong----------------------*/
class Menu
{
private:
typedef char str[20];
str List[ListMax];
public:
int NhanKey();
int XuLyKey(int key,int n);
void TaoList();
void HienThi(int n,int row);
void XoaHienThi(int row);
void DeSign();
/*Phan cai dat chuc nang cho tung List*/
void List1();
void List2();
void List3();
void List4();
void List5();
};
/*---------------------------Nhan_Key_Ban_Phim-----------------------*/
int Menu::NhanKey()
{
int key;
key = getch();
if(key==0) key = getch();
return key;
}
/*--------------------------Xu_Ly_De_List_Quay_Vong------------------*/
int Menu::XuLyKey(int key,int n)
{
switch(key)
{
case 72:
if(n>1) n--;else n = ListMax;
break;
case 80:
if(n<ListMax) n++;else n = 1;
break;
}
return n;
}
/*---------------------------Tao_List_De_In--------------------------*/
void Menu::TaoList()
{
strcpy(List[1],"[ List 1 ]");
strcpy(List[2],"[ List 2 ]");
strcpy(List[3],"[ List 3 ]");
strcpy(List[4],"[ List 4 ]");
strcpy(List[5],"[ List 5 ]");
}
/*-----------------------Hien_Thi_List_Hien_Tai----------------------*/
void Menu::HienThi(int n,int row)
{
/*Hien thi Menu tai hang row. List[n] co mau khac voi cac List con lai*/
int i;
textcolor(GREEN);
for(i=1;i<=ListMax;i++)
{
gotoxy(row,i);
cprintf(List[i]);
}
/*Di den hang row, cot n va in List[n] co mau voi cac mau khac*/
gotoxy(row,n);
textcolor(RED);cprintf(List[n]);
}
/*-------------------Xoa_Hien_Thi_List_De_In_List_Tiep_Theo----------*/
void Menu::XoaHienThi(int row)
{
int i;
for(i=1;i<=ListMax;i++)
{
gotoxy(row-1,i);
clreol();
}
}
/*-------------------Ket_Hop_De_Co_Hien_Thi_Thich_Hop----------------*/
void Menu::DeSign()
{
int n=1,m=1;
TaoList();
while(1)
{
XoaHienThi(m);
HienThi(n,20);
m = n;
n = NhanKey();
if(n==13)
{
switch(m)
{
case 1: List1(); break;
case 2: List2(); break;
case 3: List3(); break;
case 4: List4(); break;
case 5: List5(); break;
}
}
n = XuLyKey(n,m);
}
}
/*--------------------------Chuc_Nang_List_1------------------------*/
void Menu::List1()
{
gotoxy(10,10); textcolor(10);
cprintf("CHUC NANG CUA LIST 1. NHAN ENTER DE TEP TUC");
getch();
gotoxy(10,10); clreol();
}
/*--------------------------Chuc_Nang_List_2------------------------*/
void Menu::List2()
{
gotoxy(10,10); textcolor(10);
cprintf("CHUC NANG CUA LIST 2. NHAN ENTER DE TEP TUC");
getch();
gotoxy(10,10); clreol();
}
/*--------------------------Chuc_Nang_List_3-----------------------*/
void Menu::List3()
{
gotoxy(10,10); textcolor(10);
cprintf("CHUC NANG CUA LIST 3. NHAN ENTER DE TEP TUC");
getch();
gotoxy(10,10); clreol();
}
/*--------------------------Chuc_Nang_List_4-------------------------*/
void Menu::List4()
{
gotoxy(10,10); textcolor(10);
cprintf("CHUC NANG CUA LIST 4. NHAN ENTER DE TEP TUC");
getch();
gotoxy(10,10); clreol();
}
/*--------------------------Chuc_Nang_List_5-----------------------*/
void Menu::List5()
{
gotoxy(10,10); textcolor(10);
cprintf("CHUC NANG CUA LIST 5. NHAN ENTER DE EXIT");
getch();
gotoxy(10,10); clreol();
exit(1);
}
/*------------------Chuong_Trinh_Chinh----------------------------*/
int main()
{
Menu ob;
ob.DeSign();
return 0;
}
/*----------------------------The_End--------------------------------*/


Mình đã đọc 1 đoạn code về sự kết hợp giữa hai cách trên, để chương trình vừa nhận bàn phím, vừa nhận chuột.
Chương trình của nó bạn tải về xem thử:
http://www.mediafire.com/?76a5qws50dswl34
Tài liệu tham khảo:
http://www.mediafire.com/?290vhx0bxhrqyaa
http://www.mediafire.com/?8i2ce7qw8a4nwbo
Nhưng như đã nói ở bài trước, mình mong mọi người có những góp ý, bổ sung cho mình. Cảm ơn mọi người đã theo dõi^^