آذر ۱۷, ۱۳۹۷ Mostafa بدون دیدگاه

اگر دنبال برنامه نویس برای ساخت افزونه ،قالب،سایت،برنامه ویندوز،اپلیکیشین اندروید،ربات تلگرام و.... هستید ،سفارش برنامه نویسی را مطالعه نمایید.

توجه : درخواست افزونه ،قالب، اسکریپت و نرم افزار و ... و سوالات و مشکلات خود را در انجمن ارسال نمایید

برای استفاده از مویس در Dos می بایست از وقفه ۳۳ کمک گرفت . بنابراین در این مقاله قبل از توضیح بکارگیری ماوس در C ابتدا به تشریح بکارگیری وقفه ها در C می پردازیم.
کسانی که با زبان برنامه نویسی اسمبلی کار کرده اند ، با کار وقفه ها به خوبی آشنایی دارند . در واقع در زبان اسمبلی تمامی کارها با فراخوانی وقفه ها انجام میشود چرا که این زبان یک زبان سطح پایین است . اما در زبانهای سطح بالا مثل C وقفه ها از چشم کاربر دور شده اند تا زبان برنامه نویسی به زبان محاوره ای انسان نزدیکتر شود . با این حال فراخوانی وقفه ها در C برای برنامه نویس امکان پذیر است .
در زبان C ایتدا باید یک متغیر از نوع رجیستر تعریف شود تا بتوان به کمک آن به رجیستر ها دستیابی داشت :
REGS r;
در تعریف بالا متغیر r از نوع Register تعریف شده که این نوع در سرفایل Dos.h قرار دارد.
حال برای دستیابی به یک رجیستر مانند AX و یا اجزای آن یعنی AH , AL یک یونیون در Dos.h تعریف شده است که ساختمان داخلی x در آن برای دستیابی به رجیستر ۲ بایتی (رجیستر کامل ) مانند AX و ساختمان داخلی h برای دستیابی به اجزای رجیستر ۲ بایتی یعنی AH , AL که یک بایتی هستند ، می باشند:

Union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};

پس اگر بخواهیم به رجیستر AX و مانند آن دستیابی پیدا کنیم می نویسیم :
r.x.ax
و برای اجزای آن می نویسیم :

r.h.ah
r.h.al

پس از مقدار دهی رجیستر ها و مشخص کردن شماره تابع یا سرویس ، نوبت به فراخوانی وقفه یا اینتراپت می رسد که با فرمان زیر انجام می شود :
int86(آدرس متغیر رجیستر خروجی,آدرس متغیر رجیستر ورودی,شماره وقفه در مبنای ۱۶);
اعداد مبنای ۱۶ در C با ۰x شروع می شوند . مثلا اگر بخواهیم تابع شماره ۱ از وقفه ۳۳ را فراخوانی کنیم باید شماره تابع را در AH قرار داده و سپس وقفه را فراخوانی کنیم :

REGS in,out;
in.x.ax=0x01;
int86(0x33,&in,&out);

که البته در مثال بالا از آنجایی که AH جزوی از AX می باشد و در سمت راست مقدار دهی می شود از AX استفاده شده است . در واقع AX=01 یعنی AL=0 و AH=1 .
متغیر in شامل ورودی های وقفه است و چنانچه وقفه خروجی هم داشته باشد خروجی های آن در out قرار می گیرد.
حال به استفاده از ماوس می پردازیم .
۱- راه اندازی ماوس : تابع ۰ از وقفه ۳۳ : اگر پس از اجرای وقفه مقدار AX برابر ۰ باشد یعنی ماوس راه اندازی نشده است .

int Mouse(void){
REGS in,out;
in.x.ax=0x00;
int86(0x33,&in,&out);
if(out.x.ax==0) return 0;
return 1;
}

لازم به ذکر است که قبل از فراخوانی این تابع باید درایور ماوس در داس را اجرا کنید مثلا : GMouse.com
۲ – نمایش کرسر ماوس : تابع ۱ از وقفه ۳۳ : پس از راه اندازی مویس اجرا می شود .

void ShowCursor(void){
REGS in,out;
in.x.ax=0x01;
int86(0x33,&in,&out);
}

۳- مخفی کردن کرسر ماوس : تابع ۲ از وقفه ۳۳ :

 void HideCursor(void){
REGS in,out;
in.x.ax=0x02;
int86(0x33,&in,&out);
}

۴-بدست آوردن مختصات مکان نمای مویس : تابع ۳ از وقفه ۳۳ : پس از اجرای وقفه شماره ستون در CX و سطر در DX قرار می گیرد .

void CursorLocate(int* column,int* row){
REGS in,out;
in.x.ax=0x03;
int86(0x33,&in,&out);
*column=out.x.cx;
*row=out.x.dx;
}

۵- انتقال کرسر : تابع ۴ از وقفه ۳۳ : قبل از فراخوانی می بایست شماره ستون مورد نظر در CX و شماره سطر در DX قرار گیرد .

 void CursorTo(int column,int row){
REGS in,out;
in.x.ax=0x04;
in.x.cx=column;
in.x.dx=row;
int86(0x33,&in,&out);
}

۶- تست کلیک شدن ماوس : تابع ۵ از وقفه ۳۳ : شماره کلید ماوس باید در BX قرار گیرد ( ۰ برای چپ – ۱ برای راست و ۲ برای وسط ) . اگر کلیک شده باشد مقدار ۱ در BX و گرنه ۰ در آن قرار می گیرد.

int Click(int key){
REGS in,out;
in.x.ax=0x05;
in.x.bx=key;
int86(0x33,&in,&out);
return out.x.bx;
}

توابع گفته شده سرویسهای مهم بکارگیری ماوس بود . سایر توابع را می توانید در جدول وقفه های داس در ستون وقفه ۳۳ بیابید .


برچسب ها
نظرات

توجه : لطفاً فقط نظرات خود را از این طریق ارسال نمایید و سوالات و مشکلات خود را در انجمن سایت مطرح نمایید.