PDA

View Full Version : حرکت موس



Arcsinos
دوشنبه 24 مرداد 1390, 20:16 عصر
سلام

میخوام ببینم اگه توی c سه تا دکمه خودمون درست کنیم ، برای اینکه برای روییداد حرکت موس روی این دکمه ها یه تابع بنویسیم باید موقعی که موس حرکت میکنه بیاییم ببینیم که موس روی این دکمه ها قرار داره یا اینکه توی خود دکمه یه تابع قرار بدیم که بیاد بررسی کنه که موس روشه یا یه جای دیگست ؟

در کل سوال اینه موس میفهمه که روی دکمه قرار داره یا دکمه میفهمه که موس روشه ؟

البته بدون توجه به ویندوز یا سیستم عامل های دیگه . فکر کنید میخواییم یه دکمه رو از بیس خودمون طراحی کنیم .

ممنون

quiet_programmer
سه شنبه 25 مرداد 1390, 12:01 عصر
با سلام.

برای اینکار شما باید موس رو تو محیط داس فعال کنید و مکان فعلی موس رو لحظه به لحظه بخونین. در صورتی که موقیت پوینتر موس وارد محدوده دکمت شد یعنی الان موس روی دکمه قرار داره. کد زیر رو من از لینک زیر برات گذاشتم که هر لحظه موقیت پوینتر موس و همچنین کلیدی که فشار داده میشه رو برات نشون میده. با کمی تغییر میتونی این کد رو به چیزی که مد نظرت هست تبدیل کنی.

#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<dos.h>
union REGS in,out;
int callmouse()
{
in.x.ax=1;
int86(51,&in,&out);
return 1;
}
void mouseposi(int &xpos,int &ypos,int &click)
{
in.x.ax=3;
int86(51,&in,&out);
click=out.x.bx;
xpos=out.x.cx;
ypos=out.x.dx;
}

int mousehide()
{
in.x.ax=2;
int86(51,&in,&out);
return 1;
}
void setposi(int &xpos,int &ypos)
{
in.x.ax=4;
in.x.cx=xpos;
in.x.dx=ypos;
int86(51,&in,&out);
}
int main()
{
int x,y,cl,a,b;
clrscr();
int g=DETECT,m;
initgraph(&g,&m,"c:\tc\bgi");
a=100;
b=400;
setposi(a,b);
callmouse();
do
{
mouseposi(x,y,cl);
gotoxy(10,9);
printf("\n\tMouse Position is: %d,%d",x,y);
printf("\n\tClick: %d",cl);
printf("\n\tPress any key to hide the mouse");
}while(!kbhit());
getch();
mousehide();
printf("\n\n\tPress any key to Exit");
getch();
}

کد از لینک: http://www.codeproject.com/KB/cpp/mouseasp.aspx

Arcsinos
چهارشنبه 26 مرداد 1390, 22:25 عصر
با تشکر دوست عزیز

سوال من این نبود که چطور میشه از موس تو محیط داس استفاده کرد ، سوال من اینه که وقتی روی یه دکمه کلیک میکنیم ، موس میفهمه که روی دکمه قرار داره یعنی موس تو اون لحظه میاد موقعیت خودشو با همه ی دکمه های موجود تو صفه مقایسه میکنه ( که اگه اینجوری باشه پدر کامپیوتر در میاد فکر میکنی چند میلیونتا دکمه وجود داره ؟ گرچه همشون فعال نیستن ولی ) بر فرض که 100 تا دکمه وجود داشته باشه مقایسه ی همین صد تا دکمه هم باز خودش کلی وقت سی پی یو رو میگیره ، مثل اگه قرار باشه یه تابع با حرکت موس روی یه دکمه صدا زده بشه موس هر لحظه باید موقعیت خودشو با 100 تا دکمه مقایسه کنه یا اینکه وقتی رو موس کلیک میکنیم دکمه ها میان موقعیت خودشون رو با موس مقایسه میکنن بعد میفهمن که موس روشونه یا روشون نیست . اگه اینجوریم باشه باز اگه 100 تا دکمه فعال باشن پدر کامپیوتر در میاد . (ماکروسافت چی کرده ...)

همین اینترنت اکسپلورری که الان جلوم بازه بیشتر از 100 تا جا داره که اگه موسم رو روی هر کدومش ببرم یه پیغامی روش چاپ میشه . در کل به نظر میاد یه الگوریتم ساده یا پیچیده کارمونو را بندازه .

ولی من فکر میکنم اول باید یه آرایه درست کنیم بعد موقعیت همه ی دکمه های فعال رو بریزیم توی اون و بعد مرتبش کنیم و بعد هم یه جستوجوی سریع انجام بدیم و تابع mouse move یا click یا .... دکمه ی مورد نظر رو صدا بزنیم .

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

بر فرض که این کارها رو هم کردیم این کارمون فقط به درد نقاشی میخوره اگه بخواییم یه ساعت هم گوشه ی پنجرمون کار کنه باید بریم چند نخی یا به قول خارجیا multithreading رو هم یاد بگیریم . شیطونه میگه بیخیال شو .

نکته : بعد میگن سی قدرت داره :لبخند: اینکه همش اسمبلیه

ممنون

quiet_programmer
جمعه 28 مرداد 1390, 10:22 صبح
با سلام.


میخوام ببینم اگه توی c سه تا دکمه خودمون درست کنیم

بره 3 تا دکمه از همین رو ش استفاده کن.


بر فرض که این کارها رو هم کردیم این کارمون فقط به درد نقاشی میخوره اگه بخواییم یه ساعت هم گوشه ی پنجرمون کار کنه باید بریم چند نخی یا به قول خارجیا multithreading رو هم یاد بگیریم . شیطونه میگه بیخیال شو .

هرکه طاووس خواهد جور هندوستان کشد.

djsohrab2007
شنبه 29 مرداد 1390, 22:02 عصر
کتابخانه graphics.h اصلا تو ویندوز کار نمی کنه !
من فکر کنم باید از opengl یا directx استفاده کنی

quiet_programmer
یک شنبه 30 مرداد 1390, 10:32 صبح
با سلام.


کتابخانه graphics.h اصلا تو ویندوز کار نمی کنه !

میشه بگین چه جوری به این نتیجه رسیدین؟

r00tkit
یک شنبه 30 مرداد 1390, 10:50 صبح
با سلام.



میشه بگین چه جوری به این نتیجه رسیدین؟

لازم نیست بگه تو خودت بلدی از گوگل استفاده کنی ؟ این header استاندارد C یا C++ نیست این header یه لایبرری برای ++borland C هستش و برای DOS نه ویندوز


No, this is a compiler-specific library for the ancient DOS compiler Turbo C by Borland. No other compiler supports it - it is not standard C.

_hamid
یک شنبه 30 مرداد 1390, 11:52 صبح
اینکه مثلا تو می خوای یه ساعت اون گوشه داشته باشی که واسه خودش کار کنه خوب این خودش میشه یه پروسه که سیستم عامل جداگانه باهاش برخورد می کنه.
این کار های رو سیستم عامل و محیط x انجام می ده با کمک کارت گرافیک و فیلان.
اتفاقا خیلی واسه منم جالب شد.
و رفتم دنبالش :
http://www.x.org/wiki/Development/Documentation/InputEventProcessing
http://c2.com/cgi/wiki?EventQueue
http://tronche.com/gui/x/xlib/events/structures.html
http://c2.com/cgi/wiki?AsynchronousProgramming
http://en.wikipedia.org/wiki/Event_loop

و تو چرا دلت واسه cpu می سوزه؟ خوب کارش اینه :چشمک:
جدای اینها چیزای دیگه هم هست که سیستم عامل و سی پی یو خیلی درگیرشون هستن.
اما اینکه می گی سی قدرت نداره رو دیگه از کجات در آوردی؟ :لبخند:
فکر کردی سیستم عامل رو با چی نوشتن ؟ با اسمبلی؟ با سی و سی پلاس پلاس دیگه.

r00tkit
یک شنبه 30 مرداد 1390, 13:37 عصر
فکر کردی سیستم عامل رو با چی نوشتن ؟ با اسمبلی؟ با سی و سی پلاس پلاس دیگه.


از خودت نظر نده قسمت از ویندوز رو مثلا context switching رو با اسمبلی نوشتن کرنل رو با C و قسمتی از شل رو با C++

http://technet.microsoft.com/en-us/library/cc767881.aspx

_hamid
یک شنبه 30 مرداد 1390, 14:13 عصر
عزیز من کرنل و شل و محیط گرافیکی (که همش سی پلاس پلاسه ) با هم می شن هویج؟ سیستم عامل می شن دیگه :لبخند:
از خودم در میارم؟ کرنل لینوکس تقریبا همش رو با سی نوشتن بجز بعضی قسمت هاش که زیادی باید سطح پایین می کار می کردن زدن تو کار اسمبلی!

quiet_programmer
یک شنبه 30 مرداد 1390, 16:50 عصر
لازم نیست بگه تو خودت بلدی از گوگل استفاده کنی ؟راستشو بخوای نه بلد نیستم. منبعی براش معرفی میکنی؟ شاید من هم یاد گرفتم.


این header استاندارد C یا C++ نیست این header یه لایبرری برای ++borland C هستش و برای DOS نه ویندوزاستدلال جالبی بود.

موفق باشین

Arcsinos
دوشنبه 31 مرداد 1390, 13:22 عصر
خب بهتره مباحث رو جدی کنیم و از بحث حرکت موس دور نشیم :

یه نگاه به اینها بندازیم فکر میکنم بشه امیدوار شد :

1- 1982 - MS-DOS : همون طور که معلومه یه سیستم عامل خطیه .
74198

2- 1985 - Microsoft Windows 1.0 : اینم که یه مقدار گرافیکی شده ولی خیلی جالبه که تو ویندوز نسخه ی 1 پنجره ها نمیتونستن روی هم قرار بگیرن ، همچنین اون ساعتی هم که من بهش اشاره کردم اینجا هم به صورت جدا نمیتونه کار کنه و فقط باید یه کار انجام بدیم .

74199

3- 1987 - Microsoft Windows 2.0 : خب اینجا یه کار خیلی گنده ای که کرذن اینه که پنجره ها روی هم میتونن قرار بگیرن و مینی و ماکسی مایز رو هم داشت . یه مقدار هم رنگی شده بود . ولی باز نمیتونست یه ساعت رو جدا نشون بده (خواهشا دقت کنید ، شما که میگید راحته )
74200

4- 1987- Microsoft Windows 3.0 : خب بالاخره انتظار ها به پایان رسید و قابلیت مولتی تسکینگ به ویندوز اضافه شد . تو این نسخه همونطور که تو شکل مشخصه ویندوز میتونه چند کارو با هم انجام بده از جمله ساعت ما که قراره نشون بده . قابلیت تغییر اندازه ی پنجره ها رو هم داره .
74201

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

موفق باشید

_hamid
دوشنبه 31 مرداد 1390, 14:04 عصر
شما گفتی می خوای application بنویسی! نه اینکه خود سیستم عامل رو بنویسی.
گفتم که thread ها و process ها رو سیستم عامل مدیریت می کنه.
پس خیلی از کارها آسون می شه.

Arcsinos
دوشنبه 31 مرداد 1390, 14:40 عصر
درسته دوست عزیز ولی من میخوام اپلیکیشن خودم رو تو محیط سی بنویسم . اگه میخواستم تو میحیط دات نت بنویسم که تا الان 121 بار نوشته بودم . در ضمن اگه در مورد نحوه ی مولتی تردینگ توی زبان سی چیزی میدونید بگید شاید کمک کنه .
با تشکر

r00tkit
سه شنبه 01 شهریور 1390, 13:50 عصر
راستشو بخوای نه بلد نیستم. منبعی براش معرفی میکنی؟ شاید من هم یاد گرفتم.

استدلال جالبی بود.

موفق باشین

http://lmgtfy.com/?q=how+use+google

استدلال نبود پسرم دقت کن ببین چی نوشتم این header استاندارد c/c++ نیست , و فقط زمانی می تونی ازش استفاده کنی که کامپایلرت Turbo c++ هستش انم فقط تحت داس

پ.ن: اگه بحث فنی داری ادامه بده در غیر این صورت نه