C語言的滑鼠製作(附原始碼)

來源:互聯網
上載者:User

                                                                         C語言的滑鼠製作

        學習C語言也有4、5年的時間了,以前經常會為一個很小的問題感到無助,初學者的時候就連一個簡單的FOR語句都要鬱悶好久一段時間,總是在想要到什麼時候才能搞懂。但是現在的味道變了,變得越想就越興奮。我從Windows下用win-tc編程到Linux下用emacs、vi編程,覺得對C語言的感情是越來越深了,就像我愛護這一個小孩子一樣,在她的上面了努力過、失敗過、興奮過……

       我在07年的時候,看到周邊的許多朋友在win-tc裡面搞滑鼠的製作,但是那時候是高中,自己的硬體裝置不能夠得到充足的利用,懂的只是捧著書本、啃著語句、寫這代碼……   那是在win-tc裡面製作滑鼠對於我來說是一件很遙遠的事情,根本就不敢去想,因為我當時在書本上面沒有接觸過(我看的是譚浩強的)。但也行是在高中的原因,我身邊的朋友的滑鼠程式沒有搞成功就結束了(沒有地方諮詢)。

      時隔一年,我來到了大學,選擇了直接最愛的軟體工程專業,也有了充足的硬體設施可以利用,我還是和以前一樣,捧著書本、啃著語句、寫這代碼、調試這代碼……  漸漸地,我脫離了老師的步伐,我直接一個人開了小灶,因為自由一點,時間多一點,我學會了很多我自己沒有想到的事情和技術。    現在在大學裡已經有1你的時間了,我利用了所以的資源,為我自己的對C 語言的愛好更上一層樓,我找到了 一個更好的平台——對C語言愛好者來說——Linux作業系統。雖然我對Linux的接觸時間不是很長,但是我也瞭解這隻是一個時間的問題。我會加油的。

      最近我和寢室的幾個死黨在合作一個純win-tc編寫的計算機,支援滑鼠、鍵盤的同時互動,這已經是一個完成的項目,雖然我們所些的東西的難度不是很大,但是對於我們自己來說卻已經是一種超越了,下面就是我們開發的一個滑鼠的程式的原始碼:

 

(這裡要說明一下:

              在win-tc裡面製作滑鼠的原理是利用了DOS的0x33非強制中斷(也可以說是滑鼠中斷)。在設定了滑鼠的橫、列的大   小後-->裝在滑鼠-->畫滑鼠---->儲存被滑鼠覆蓋的像素點---->移動滑鼠的座標---->重寫被滑鼠覆蓋的像素點。一直這樣迴圈。 

           儲存被滑鼠覆蓋的像素點和重畫被滑鼠覆蓋的像素點用到了畫圖的兩個函數putpixel()、getpixel() ,至於他們的詳細資料,自己直接到網上查。

 

 

 

#include <dos.h >
#include <conio.h>
#include <graphics.h>
#include <bios.h>
#define MouseStatusMouseOn  1
/*#include <E:/Win-TC/projects/Desk.c>*/
/*#include <E:/Win-TC/projects/MouseR.c>*/         /*這裡是包含檔案頭*/
struct mouse
{
   int top;
   int botton;
   int left;
   int rigth;
}Smouse;
extern void Dosk();
  unsigned int size;
  void *ball;
int MouseX        =0;        /*存放滑鼠的水平方向的值*/
int MouseY        =0;
char MouseType    =1;

enum MOUSE_MESSAGES_CODE
{        NOTHING=0,
        LBUTTONCLK=1,

};
int arrowMousePixSave[16][10];
int arrowMouseDraw[16][10]={    /*設計滑鼠的形狀,其中1:表示滑鼠的邊界,2:表示滑鼠邊界所包圍的地區,3:表示滑鼠以外的地區*/
 {1,1,3,3,3,3,3,3,3,3},{1,2,1,3,3,3,3,3,3,3},{1,2,2,1,3,3,3,3,3,3},{1,2,2,2,1,3,3,3,3,3},
 {1,2,2,2,2,1,3,3,3,3},{1,2,2,2,2,2,1,3,3,3},{1,2,2,2,2,2,2,1,3,3},{1,2,2,2,2,2,2,2,1,3},
 {1,2,2,2,2,2,2,2,2,1},{1,2,2,2,2,2,2,1,3,3},{1,2,2,2,2,2,1,3,3,3},{1,2,1,3,1,2,2,1,3,3},
 {1,1,3,3,1,2,2,1,3,3},{3,3,3,3,3,1,2,2,1,3},{3,3,3,3,3,1,2,2,1,3},{3,3,3,3,3,3,1,1,2,1} };
 int editMousePixSave[15][5];
int editMouseDraw[15][5]={
{1,1,3,1,1},{3,3,1,3,3},{3,3,1,3,3},{3,3,1,3,3},{3,3,1,3,3},{3,3,1,3,3},{3,3,1,3,3},{3,3,1,3,3},
{3,3,1,3,3},{3,3,1,3,3},{3,3,1,3,3},{3,3,1,3,3},{3,3,1,3,3},{3,3,1,3,3},{1,1,3,1,1}
   };
 void GetMouseXY();
    void MouseOn(int mousex,int mousey)
{
    int i,j;
    int color;
    if(MouseType==1)
    {
        for(i=0;i<16;i++)
    for(j=0;j<10;j++)
    {
        arrowMousePixSave[i][j]=getpixel(mousex+j,mousey+i);/* 儲存原來的顏色*/
        if(arrowMouseDraw[i][j]==1)
        putpixel(mousex+j,mousey+i,0);
        else if(arrowMouseDraw[i][j]==2)        /* 畫滑鼠*/
            putpixel(mousex+j,mousey+i,15);
    }
    }
    else if(MouseType==2)
    {
    for(i=0;i<15;i++)
            for(j=0;j<5;j++)
            {
            editMousePixSave[i][j]=getpixel(mousex-2+j,mousey-7+i);
        if(editMouseDraw[i][j]==1)            /*由於編輯滑鼠的熱點在滑鼠的中心*/
            putpixel(mousex-2+j,mousey-7+i,0);
        }
    }
}
void SetMouseHori(int minX,int maxX)
 {
    _AX=0x07;
    _CX=minX;
    _DX=maxX;
    geninterrupt(0x33);
}

void SetMouseVert(int minY,int maxY)
 {
    _AX=0x08;
    _CX=minY;
    _DX=maxY;
    geninterrupt(0x33);
}
/*隱藏滑鼠*/
void MouseOff(int mousex,int mousey)
{
   int i,j,x,y,color;
   x=mousex;
   y=mousey;
   if(MouseType==1)
   {
      for(i=0;i<16;i++)
      for(j=0;j<10;j++)
      {
        if(arrowMouseDraw[i][j]==3)
        continue;
        color=getpixel(x+j,y+i);
        putpixel(x+j,y+i,color^color);        /*原位置異或清除*/
        putpixel(x+j,y+i,arrowMousePixSave[i][j]);/* 還原原背景*/
      }
   }
   else if(MouseType==2)
   {
        for(i=0;i<15;i++)
      for(j=0;j<5;j++)
        {
           if(editMouseDraw[i][j]==3)
            continue;
         color=getpixel(x-2+j,y-7+i);
         putpixel(x-2+j,y-7+i,color^color);    /*原位置異或清除*/
         putpixel(x-2+j,y-7+i,editMousePixSave[i][j]);/* 還原原背景*/
        }

    }
}
void SetMouseXY(int x,int y)
 {
   _AX=0x04;
   _CX=x;
   _DX=y;
    geninterrupt(0x33);
 }
void GetMouseXY()
{
    _AX=0x03;
    geninterrupt(0x33);
    MouseX=_CX;        /*將滑鼠水平方向位置存放到MouseX*/
    MouseY=_DX;        /*將滑鼠垂直方向位置存放到MouseY*/

}
void initgr(void) /* BGI初始化 */
{
  int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同樣效果 */
  registerbgidriver(EGAVGA_driver);/* 註冊BGI驅動後可以不需要.BGI檔案的支援運行 */
  initgraph(&gd, &gm, "");
  SetMouseXY(0,0);
  SetMouseHori(0,600);
  SetMouseVert(0,450);
  setfillstyle(SOLID_FILL,7);
           bar(100,280,140,300);

  size=imagesize(100,280,141,301);
  ball=malloc(size);
  getimage(100,280,141,301,ball);
}

void main()
{   int q=0;
   float p=0;
    int temp1=0;
    int x,y,MouseMSG,M;
  int tempx,tempy,mouseMsg;

  char ch1;
  tempx=tempy=100;
  initgr();
   GetMouseXY();
   x=MouseX;
   y=MouseY;
   putimage(100,280,ball,XOR_PUT);
   while(!kbhit())
    {

        GetMouseXY();/*get current mouse position */
        /*更新滑鼠位置*/
        if(tempx!=MouseX || tempy!=MouseY)
        {
            MouseOff(tempx,tempy);
            MouseOn(MouseX,MouseY);        /*顯示滑鼠,但儲存即將被滑鼠覆蓋的地區*/
            tempx=MouseX;                  /* cache current mouse pos */
            tempy=MouseY;
        }
        _AX=0x03;            /*讀取滑鼠按鍵狀態*/
       geninterrupt(0x33);        /*產生33號滑鼠非強制中斷*/

        if((_BX&1) && !(_BX&2))        /*滑鼠左鍵被按下同時右鍵沒有按下*/
            {
               MouseMSG=4;
               M=MouseMSG;
             }
         if((_BX&2) && !(_BX&1))        /*滑鼠右鍵被按下同時左鍵沒有按下*/
            {
              MouseMSG=5;
              M=MouseMSG;
            }
        if(_BX&1 && _BX&2)        /*滑鼠左鍵和右鍵同時被按下*/
           {
             MouseMSG=3;
             M=MouseMSG;
           }
        _AX=0x06;            /*讀取滑鼠按鍵釋放資訊*/
        _BX=0x00;            /*指定讀取滑鼠左鍵的釋放資訊*/
        geninterrupt(0x33);        /*產生33號滑鼠非強制中斷*/
        if(_BX==1)            /*如果滑鼠左鍵的釋放數為1*/
           MouseMSG=2;            /*產生一個單擊左鍵資訊*/
         if(_BX==0&&M==4)
             if( tempx>=100&&tempx<=140&& tempy>=280&&tempy<=300)
             {
               setcolor(RED);
               /*outtextxy(100,100,"111111111111111111111");*/
               GetMouseXY();
                if(tempx!=MouseX || tempy!=MouseY)
                  {
                         /*outtextxy(200,200,"2222222222222");*/
                         putimage(300,270,ball,XOR_PUT);
                         delay(100);

                    }
             }
        /* if(_BX==1&&M==4)   */

 

         _AX=0x06;            /*讀取滑鼠按鍵釋放資訊*/
        _BX=0x01;            /*指定讀取滑鼠右鍵的釋放資訊*/
        geninterrupt(0x33);        /*產生33號滑鼠非強制中斷*/
        if(_BX==1)            /*如果滑鼠左鍵的釋放次數為1*/
          MouseMSG=1;            /*產生一個單擊右鍵資訊*/

 

   }

}

      我不知道各位是否能夠看懂,但是我認為學習C語言的中斷編程,就應該把DOS的0x33號非強制中斷搞懂,因為DOS的0x33的滑鼠中斷也是Windows裡面滑鼠中斷的前身。

     因為利用中斷技術,可以提高你的代碼的品質,也是作業系統裡面一個非常重要的技術。
     這樣的注釋我相信很詳細了,在這裡我希望對c語言有愛好的同學、網友能夠加油,為Linux事業奉獻最近的一份力量。

祝您好運! 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.