PDA

View Full Version : [TUTOR] "ĐIỀU KHỂN MOUSE BẰNG C"



madcat
08-10-2002, 14:36
khi lập trình các ứng dụng trong môi trường DOS, ta thường không mấy khi đến mouse vì cho rằng nó là đặc trưng của windows, thực ra ta vẫn có thể làm được điều này. Ngắt 33H của Dos đảm nhiệm vai trò điều khiển mouse. ngắt này có 11 chức năng ( nếu tôi không nhớ nhấm ) nhưng tôi chỉ trình bày những gì cơ bản và cẩn thiết nhất, những vần đề thuộc về mở rộng sẽ đưộc bàn tời sau.
sau đây là bảng tóm tắt một số chức năng cơ bản của int 33H. để sử dụng, bạn đặt giá trị cho thanh ghi ax, gọi int 33H.
có lẽ tôi không nên trình bày qúa nhiều về interupt để các bạn mới bắt đầu không "sa lầy" vào lập trỉnh điểu khiển thiết bị, do đó tôi giới thiệu luôn code của chương trinh. dây là một file header, bạn dùng notepad , chép đoạn chương trình này để tạo thảnh file mouse.h , chép file này vào thư mục include rồi sau đó sử dụng như mọi file header thông thường
Lưu ý là ở text mode, bạn phải chia cho 8 toạ độ x, y cụ thể là
MouseCoord(&x,&y)
x /= 8;
y/=8 ;
thì mới nhận chính xác toạ độ , còn ở chề độ graph thì khỏi cần
#include <dos.h>
#include <stdio.h>
typedef unsigned char byte;
//prototype
// lấy toạ dộ mouse
void MouseCoords (int *xpos, int *ypos );
// kiểm tra xem button trái có được nhấn hay không
byte MouseLPressed (void);
//kiểm tra xem buttontphải có được nhấn hay không
byte MouseRPressed (void);
//kiểm tra xem button giữa có được nhấn hay không
byte MouseMidPressed (void);

//kiểm tra xem button giữa có được thả ra chưa
byte MouseMidReleased (void);
//kiểm tra xem button trái có được thả ra chưa
byte MouseLReleased (void);
//kiểm tra xem button phải có được thả ra chưa
byte MouseRReleased (void);
// khởi tạo mouse
byte MouseInit (void);
// hiện mouse
void MouseShow (void);
// dấu mouse
void MouseHide (void);
// đặt vị trí mouse tại toạ độ xy
void MouseSetPosition (int x, int y );
// lấy trạng thái mouse khi đưôc nhấn
void MouseGetBPressInfor (int *Status, int *Count, int Button);
// lấy trạng thái mouse khi nhả ra
void MouseGetBRelInfor (int *Status, int *Count, int Button);
// giới hạn tầm hoạt động của mouse
void MouseSetHMinMax (int Min, int Max);
void MouseSetVMinMax (int Min, int Max);
void MouseReset (void);


void MouseReset (void)
{
struct REGPACK regs;
regs.r_ax = 0x21;
regs.r_bx = 0;
regs.r_cx = 0;
regs.r_dx = 0;
regs.r_si = 0;
regs.r_di = 0;
regs.r_ds = 0;
regs.r_es = 0;
intr(0x33,&regs);
}

byte MouseInit (void)
{
struct REGPACK regs;
regs.r_ax = 0;
regs.r_bx = 0;
regs.r_cx = 0;
regs.r_dx = 0;
regs.r_si = 0;
regs.r_di = 0;
regs.r_ds = 0;
regs.r_es = 0;
intr(0x33,&regs);
if ( regs.r_ax != 0 ) return 1 ;
else return 0 ;
}


void MouseShow (void)
{
struct REGPACK regs;
regs.r_ax = 1;
regs.r_bx = 0;
regs.r_cx = 0;
regs.r_dx = 0;
regs.r_si = 0;
regs.r_di = 0;
regs.r_ds = 0;
regs.r_es = 0;
intr(0x33,&regs);
}
void MouseHide (void)
{
struct REGPACK regs;
regs.r_ax = 2;
regs.r_bx = 0;
regs.r_cx = 0;
regs.r_dx = 0;
regs.r_si = 0;
regs.r_di = 0;
regs.r_ds = 0;
regs.r_es = 0;
intr(0x33,&regs);
}
void MouseCoords (int *xpos, int *ypos )
{
struct REGPACK regs;
regs.r_ax = 3;
regs.r_bx = 0;
regs.r_cx = 0;
regs.r_dx = 0;
regs.r_si = 0;
regs.r_di = 0;
regs.r_ds = 0;
regs.r_es = 0;
intr(0x33,&regs);
*xpos = regs.r_cx;
*ypos = regs.r_dx;}
void MouseSetPosition (int x, int y )
{
struct REGPACK regs;
regs.r_ax = 4;
regs.r_bx = 0;
regs.r_cx = x;
regs.r_dx = y;
regs.r_si = 0;
regs.r_di = 0;
regs.r_ds = 0;
regs.r_es = 0;
intr(0x33,&regs);
}


void MouseGetBPressInfor (int *Status, int *Count, int Button)
{
struct REGPACK regs;
regs.r_ax = 5;
regs.r_bx = Button;
regs.r_cx = 0;
regs.r_dx = 0;
regs.r_si = 0;
regs.r_di = 0;
regs.r_ds = 0;
regs.r_es = 0;
intr(0x33,&regs);
*Status = regs.r_ax;
*Count = regs.r_bx;
}
void MouseGetBRelInfor (int *Status, int *Count, int Button)
{
struct REGPACK regs;
regs.r_ax = 6;
regs.r_bx = Button;
regs.r_cx = 0;
regs.r_dx = 0;
regs.r_si = 0;
regs.r_di = 0;
regs.r_ds = 0;
regs.r_es = 0;
intr(0x33,&regs);
*Status = regs.r_ax;
*Count = regs.r_bx;
}
void MouseSetHMinMax (int Min, int Max)
{
struct REGPACK regs;
regs.r_ax = 7;
regs.r_bx = 0;
regs.r_cx = Min;
regs.r_dx = Max;
regs.r_si = 0;
regs.r_di = 0;
regs.r_ds = 0;
regs.r_es = 0;
intr(0x33,&regs);}
void MouseSetVMinMax (int Min, int Max)
{
struct REGPACK regs;
regs.r_ax = 8;
regs.r_bx = 0;
regs.r_cx = Min;
regs.r_dx = Max;
regs.r_si = 0;
regs.r_di = 0;
regs.r_ds = 0;
regs.r_es = 0;
intr(0x33,&regs);
}

byte MouseMidPressed (void)
{
int Status, Count ;
MouseGetBPressInfor(&Status,&Count,2);
if ( Status == 4) return 1 ;
else return 0 ;
}
byte MouseMidReleased (void)
{
int Status, Count ;
MouseGetBRelInfor(&Status,&Count,2);
if (( Status == 4) && (Count > 0 )) return 1;
else return 0;
}
byte MouseLPressed (void)
{
int Status, Count ;
MouseGetBPressInfor(&Status,&Count,0);
if ( (Status) ==1) return 1 ;
else return 0 ;
}

byte MouseLReleased (void)
{
int Status, Count ;
MouseGetBRelInfor(&Status,&Count,0);
if (( Status == 0) && (Count > 0 )) return 1;
else return 0;
}
byte MouseRPressed (void)
{
int Status, Count ;
MouseGetBPressInfor(&Status,&Count,1);
if ( Status == 2 ) return 1 ;
else return 0 ;
}

VnSCode
13-11-2007, 17:59
Có mouse.h rồi thì bây giờ làm cách nào để bắt sự kiện mouse click vậy hả các bác ? :helpsmili