استفاده از ماوس در سی پلاس

saalek110

Well-Known Member
نقل از:
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
كار مي كنند ولي آن سايت اين طور نوشته بود و عمل هم مي كنه پس من تغيير ندادم.
 

saalek110

Well-Known Member
منبع:
http://forum.persiantools.com/t32403-page15.html

ديگه سرويسهاي ديگه هم مشابه بالا.
سرويس 1 براي show كردن ماوس.
سرويس 2 براي hide كردن ماوس.
سرويس 3 براي يافتن محل ماوس. و همچنين فهميدن دكمه هاي فشرده ماوس. يعني كليك چپ و راست و مياني يا با همديگر.
سرويس 4 براي set كردن محل ماوس.

کد:
#include <conio.h>
#include <iostream.h>
#include <dos.h>
#include <stdlib.h>
void main()
{
  clrscr();
  char c ;

do {
    // ----------- shoroe ghaaleb -------------
     union REGS i,o;

  i.x.ax=1;
 int86(0x33,&i,&o);  // show mouse

    // ----------- entehaye ghaaleb -----------
    cout<<"----------------------new run"<<endl;
  }while((c=getch()) != 'q');

}

برنامه بالا باعث نمايش ماوس است.

کد:
#include <conio.h>
#include <iostream.h>
#include <dos.h>
void main()
{
  clrscr();
  char c ;

do {
    // ----------- shoroe ghaaleb -------------
     union REGS i,o;
  
    i.x.ax=1;
    int86(0x33,&i,&o);  
getch();
    i.x.ax=2;
    int86(0x33,&i,&o); 

    // ----------- entehaye ghaaleb -----------
    cout<<"----------------------new run"<<endl;
  }while((c=getch()) != 'q');

}

برنامه بالا ابتدا ماوس را نشان مي دهد و بعد با فشردن دكمه اي از getch رد ميشه و به كد مخفي كردن ماوس مي رسه. در سايت مذكور علت اين كه چرا مخفي شدن ماوس را مفيد دانسته بود ، گفته بود كه گاهي نمي خواهيم ماوس شكلي را كه داريم مي كشيم را پاك كند كه من نفهميدم ولي عينا نقل كردم شايد شما متوجه بشيد.
===============
ويرايش 3 تا 4 روز بعد:
من يك برنامه داشتم كار مي كردم ديشب، جايي كه ماوس بود شكل ناقص كشيده مي شد. حالا فهميدم مخفي كردن ماوس چه كاربردي دارد. يعني بايد قبل رسم، ماوس را مخفي كنيم و بعد رسم ظاهر كنيم. البته اگر ماوس آنجايي است كه مي خواهيم رسم كنيم.

کد:
#include <conio.h>
#include <iostream.h>
#include <dos.h>
void main()
{
  clrscr();
  char c ;

do {
    // ----------- shoroe ghaaleb -------------
     union REGS i,o;
  
  i.x.ax=1;
  int86(0x33,&i,&o);  
while(!kbhit())
  {
   i.x.ax=3;
   int86(0x33,&i,&o);
   gotoxy(9,9);
  
   cout<<o.x.cx<<"      "<<o.x.dx;
  
  }


    // ----------- entehaye ghaaleb -----------
    cout<<"----------------------new run"<<endl;
  }while((c=getch()) != 'q');

}

برنامه بالا حلقه اي تشكيل داده براي نمايش x و y محل ماوس. اين نوع حلقه را قبلا گفتيم كه با فشردن يك كليد خاتمه ميابد. ولي با حركت ماوس اختلالي در چرخش آن پيش نمي آيد.

کد:
#include <conio.h>
#include <iostream.h>
#include <dos.h>
void main()
{
  clrscr();
  char c ;

do {
    // ----------- shoroe ghaaleb -------------
     union REGS i,o;
  int button;


  
  i.x.ax=1;
 int86(0x33,&i,&o);  
while(!kbhit())
  {
   i.x.ax=3;
   int86(0x33,&i,&o);

  gotoxy(8,8);  
 button=o.x.bx&7;
 switch(button)
    {
      case 1:
cout<<"Left button pressed                                  ";
      break;

      case 2:
cout<<"Right button pressed                                  ";
      break;

      case 4:
cout<<"Middle button pressed                                  ";
      break;

      case 3:
cout<<"Left and Right buttons pressed                          ";
      break;

      case 5:
cout<<"Left and Middle buttons pressed                          ";
      break;

      case 6:
cout<<"Right and Middle buttons pressed                          ";
      break;

      case 7:
cout<<"All the three buttons pressed                          ";
      break;

      default:
cout<<"No button pressed....";
    }
  }


    // ----------- entehaye ghaaleb -----------
    cout<<"----------------------new run"<<endl;
  }while((c=getch()) != 'q');

}

برنامه بالا باز از همان نوع حلقه دارد و فشردن دكمه هاي مختلف ماوس را گزارش مي كند.

کد:
#include <conio.h>
#include <iostream.h>
#include <dos.h>
void main()
{
  clrscr();
  char c ;

do {
    // ----------- shoroe ghaaleb -------------
     union REGS i,o;
  int button;


  
  i.x.ax=1;
 int86(0x33,&i,&o);  
while(!kbhit())
  {
   i.x.ax=3;
   int86(0x33,&i,&o);
   gotoxy(2,2);
 
   cout<<o.x.cx<<endl;
    cout<<o.x.dx<<endl;
getch();

 i.x.ax=4;
    i.x.cx=150;
    i.x.dx=100;
    int86(0x33,&i,&o);
  }


    // ----------- entehaye ghaaleb -----------
    cout<<"----------------------new run"<<endl;
  }while((c=getch()) != 'q');

}

برنامه بالا با كدنويسي ماوس را به نقطه اي پرتاب مي كند. نمي دانم كاربردش چيه ولي طرز كار برنامه بالا اينه كه با زدن كليدي از صفحه كليد ، از getch عبور مي كنه برنامه و ماوس به جاي دلخواه يعني 150 و 100 مي پرد.

در سايت يك برنامه هم گفته بود براي محدود كردن ماوس در محدوده اي كه من ديگر نقل نكردم و برنامه هاي ديگه هم بود. خودتان مي توانيد مراجعه كنيد.
.
يك نگاهي هم به :

http://electrosofts.com/cgraphics/mouse.html

بياندازيد. البته من دقيق نمي دانم چيه. فعلا آدرسش را گذاشتم تا بعدا باز مراجعه كنم.

و اين:

http://www.codeproject.com/Purgatory/mouseasp.asp
 

saalek110

Well-Known Member
http://forum.persiantools.com/t32403-page17.html

با سلام مجدد.
سرويس صفر چك مي كنه كه ماوس در دسترس هست يا نه.در همين تاپيك برنامه اش هست.
سرويس 5 را برنامه اش را مي نويسم. البته اگر نتوانستم به مرحله استفاده برسونمش(مرحله چك) آنوقت فقط نقل مي كنم خدمتتان تا خودتون رديفش كنيد.
.
============
اي واي من اشتباه ديدم شما گفتيد 0c نه 0 .
دنبال اونم مي رم.
.
==================
==================

وقفه را بگذار روي 33
سرويس را بگذار روي 5

اگر كليك چپ مي خواهي bx را صفر كن
اگر كليك راست مي خواهي bx را يك كن
.
- -- --- -- -- -- -- --- --- ---
دريافت پاسخ:
رجيستر bx ميشه تعداد كليك
رجيستر cx ميشه ستون آخرين كليك
رجيستر dx ميشه رديف آخرين كليك

== = = = = == = = = = == = = = = =
اگر زودتر از من برنامه اش را نوشتي و چك كردي ، پست بزن.
من هم بروم برنامه اش را بسازم.
.
=========================
سرويس شماره 6 هم مثل سرويس شماره 5 است ولي فرقش اينه كه تعداد رها كردن ها و محل آخرين رها كردن ماوس را نشان مي دهد.
پس براي درگ كردن(گرفتن چيزي با ماوس و بردن به جايي ) كاربرد داره.
 

جدیدترین ارسال ها

بالا