با سلام.
امروز میخواهم چند نکته در مورد استفاده از ماوس در برنامه گرافیکی در سی پلاس را توضیح بدهم.از آنجا که نوشتن برنامه گرافیکی بدون ماوس غیر ارزشی ندراد لازم دانتسم تا این چندنکته مفید را توضیح بدهم.امیدوارم برایتان مفید واقع شوند...
/dos>>/>>/>>/>/dos>>/>>/>>/>نکته اول درمورد تعریف ماوس است.این کار بکمک وقفه ها انجام میشود.
اگر قبلا با وقفه ها کار کرده باشید حتما می دانید که شماره تابع وقفه در ثبات AH قرار می گیرد ولی توابع 33hex به جای AH از AX استفاده می کنند. یعنی برای فراخوانی این وقفه شماره تابع آن را در ثبات AX قرار می دهیم. پس از فراخوانی این وقفه اگر مقدار ثبات AX برابر 0000hex باشد یعنی درایور ماوس نصب نشده و ما نمیتوانیم از ماوس استفاده کنیم. پس از این کار باید نشانگر ماوس را د ر صفحه ظاهر کنیم. نشانگر ماوس دقیقا در وسط صفحه ظاهر خواهد شد. اگر در حالت متنی باشیم این نشانگر به صورت یک مستطیل و اگر در حالت گرافیکی باشیم نشانگر به صورت یک فلش کوچک نشان داده خواهد شد. برای ظاهر کردن کافی است از تابع showmouse وقفه 33h استفاده کنیم.
تابع مفید دیگری برای کار با ماوس تابع hidemouse از وقفه 33hex میباشد. این تابع نشانگر ماوس را پنهان می کند. فرض کنید می خواهید مانند برنامه Paint وقتی ماوس را میکشید یک خط هم با آن کشیده شود. در این حالت اگر نشانگر ماوس دیده شود بعضی از نقاط خط پاک خواهند شد و بهتر است که در این مواقع نشانگر را پنهان کنیم. برای کار با ماوس ما باید بدانیم که نشانگر اکنون د رکجای صفحه می باشد یعنی مختصات (x,y) آن را بدست آوریم. برای این کار از تابع getmouse استفاده می کنیم. که پس از فراخوانی تابع ثبات CX حاوی مختصات افقی(x) و DX حاوی مختصات عمودی نشانگر خواهد بود. کار مهم دیگر تشخیص کلیدهای فشرده شده ماوس است. getmouse همچنین تعیین می کند که کدام کلید از ماوس فشرده شده است. این کلیدها را ثبات BX تعیین میکند. فقط همین کافی است که بدانید پس از فراخوانی وقفه اگر BX برابر با 00000001)Hex (باشد کلید چپ ماوس فشار داده شده است:
#include
void initmouse()
{
_AX=0;
geninterrupt(0x33);
}
void showmouse()
{
_AX=1;
geninterrupt(0x33);
}
void hidemouse()
{
_AX=2;
geninterrupt(0x33);
}
void restrictmouse(int x1,int y1,int x2,int y2)
{
_AX=7;
_CX=x1;
_DX=x2;
geninterrupt(0x33);
_AX=8;
_CX=y1;
_DX=y2;
geninterrupt(0x33);
}
void getmouse(int *button,int *x,int *y)
{
_AX=3;
geninterrupt(0x33);
*button=_BX;
*x=_CX;
*y=_DX;
}
void setmouse(int x,int y)
{
_AX=4;
_CX=x;
_DX=y;
geninterrupt(0x33);
}/dos>>/>>/>>/>
برای مثال اگر بخواهیم منتظر کلیک بمانیم و مختضات کلیک را دریافت کنیم از کدی مثل این استفاده میکنیم:
/dos>>/>>/>>/>init mouse();
int button,x,y;
while(button!=1)
{
showmouse();
getmouse(&button,x,y);
}
نکته دوم در مورد طراحی button است.برای طراحی هر کلیک یک مستطیل (شکل کلیک ) رسم میکنیم و تعریف میکنیم درصورتیکه روی محدوده آن در صفحه کلیک بشود فلان تابع اجرا
/dos>>/>>/>>/>بشود.برای مثال:
setfillstyle(1,7);
bar(100,100,200,200);
if(x>=100 && x<=200 && y>=100 && y<=200)
{
f();
}
/dos>>/>>/>>/>که اینجا تابع bar یک مستطیل توپر رسم میکیند و تابع setfillstyle در آرگومان اول نحوه پرکردن و در آرگومان دوم کد رنگ را مشخص میکند.
نکته سوم درمورد ساختن قلم است.برای این کار تعریف میکنیم مادامی که کلیک چپ ماوس فشرده شده باشد ، شکل ماوس حذف شود و در جای آن نقطه رسم شود( باتابع putpixle یا line):
/dos>>/>>/>>/>/dos>>/>>/>>/>while(button==1) {
hide_mouse();
line(x1,y1,x2,y2);
راستی یک نکته رو داشت یادم میرفت.نکته مهم.برای اجرا شدن graphics.h آدرس زیر رو تو اول تابع main کپی کنید.اینجا باید آدرس فولدر bgi فولدر tc رو بذارین:
int gd = DETECT , gm ;initgraph(&gd , &gm , "C:\\TC\\BGI");
اگر نظر یا سوالی داشتید در خدمتم.موفق باشید.
(با تشکر از آقا بهنام).
میشه که هدر فایلشو بنویسید
واقعا از شما ممنونم.خیلی این کد رو نیاز داشتم...
دستتون درد نکنه هااااااااااااااااا...
ولی بقیه ی کلیدا چی ؟؟؟؟؟
اگه بگین ممنون میشم ......