نقل از:
http://forum.persiantools.com/t32403-page15.html
مطالب مربوط به ماوس از آدرس زير:
http://www.geocities.com/rk_page
همه برنامه هايي كه من تابحال ديدم كه ماوس را بكار گرته بودند از وقفه Dos استفاده كرده بودند. و من هم اينجا از اين روش استفاده مي كنم.
البته قبلا راجع به رجيسترها و وقفه ها كمي توضيح داديم ولي يك خلاصه باز بگم كه ميشه وقفه ها را تابع در نظر گرفت كه كاري انجام مي دهند. در اينجا وقفه شماره 33 مورد استفاده ماست براي بكارگيري ماوس.
و با مقدار دهي به رجيسترها(كه حافظه هايي در cpu هستند نه در ram ) به نوعي وقفه را تنظيم مي كنيم براي كارهاي مختلفي كه انجام مي تواند بدهد. ميشه اين مقداردهي ها را ورودي تابع در نظر گرفت.
همچنين وقفه ها خروجي خود را به رجيسترها برمي گردانند كه مي تواند دقيقا جايي باشد كه ورودي گرفته. مثلا روي ah برگرداند.
اين مقدمه كافيه تا برنامه هاي خود را بگيم.
ولي قبلش بگم كه ماوس را هم ميشه در حالت متني احضار كرد و هم در حالت گرافيكي.
در حالت متني ، ماوس ، به شكل مستطيلي ايستاده است ولي در حالت گرافيكي به همان شكل معمول ماوس.
ولي روش كار در هر دو حالت يكي است و فرقي ندارد و من فقط در حالت متني مي گم. و همين كدها را اگر در حالت گرافيكي بكار بريد هم عمل مي كنه.(من امتحان كردم)
ولي وقتي اينجا cout مي نويسيم ، معلومه كه در گرافيك بايد چيز ديگه بنويسيم . كدهايي كه آنجا عمل مي كند ، منظور ، قسمت اسمبلي است.
و يك نكته هم اين كه dos.h را بايد include كرد.
اولين برنامه تشخيص مي دهد كه ماوس قابل دسترسي هست يا نه.
کد:
#include <conio.h>
#include <iostream.h>
#include <dos.h>
void main()
{
clrscr();
char c ;
do {
// ----------- shoroe ghaaleb -------------
union REGS i,o;
i.x.ax=0;
int86(0x33,&i,&o);
if(o.x.ax==0)
cout<<"No Mouse Available"<<endl;
else
cout<<"Mouse Available"<<endl;
// ----------- entehaye ghaaleb -----------
cout<<"----------------------new run"<<endl;
}while((c=getch()) != 'q');
}
در اينجا ax را صفر مي گيريم و وقفه 33 را احضار مي كنيم ، و خروجي اين وقفه هم در ax برميگرده كه از آن مي فهميم كه ماوس قابل دسترس هست يا نه.
به نوعي ميشه بگي از سرويس شماره صفر اين وقفه استفاده شده.
.
البته قانونا با
ah
كار مي كنند ولي آن سايت اين طور نوشته بود و عمل هم مي كنه پس من تغيير ندادم.