線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2196
推到 Plurk!
推到 Facebook!

C++Builder部屋-鼠標光標看守候眼球

 
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-19 19:44:51 IP:218.175.xxx.xxx 未訂閱
http://www.ne.jp/asahi/nagoya/ahomaro/builder/ C++Builder 部屋    這裡MouseCapture叫做屬性使用鼠標的補足正在行為。 這MouseCapturetrue指定事鼠標光標表單的外部的離開時同樣鼠標的移動面對提示被送佝僂象結。 這MouseCapture有效仁科線,表單的外部的鼠標被使…離開也那個提示被送不苦戀因為OnMouseUp不發生因為動作神色瓜子久那這種東西做完。     因此問這種東西鼠標的集會取得因此總是MouseCapturetrue乘方不是。 鼠標補足能夠的是同時一個的窗口隻有不能從。 工程項目b_eye,X-Winodw有名的x-eye的象鼠標光標的位置看守候程序。    鼠標光標看守候眼球 這程序秒表使鼠標光標的位置取得上次與位置正在不同們繪畫於是說因為沙灘。 程序公允,眼的位置要求卻復雜是的計算實行,捆橢圓與直線的交點要求為了的計算典禮。 職務不立與正在想數學這樣的可是也被應用有(這計算典禮引導拿出卻半日哈哈っ田野秘密(^^;;)。
 
//---------------------------------------------------------------------------    class TForm6 : public TForm
{
__published:        // IDE 管理的元件
    TTimer *Timer1;
    void __fastcall FormPaint(TObject *Sender);
    void __fastcall Timer1Timer(TObject *Sender);
    void __fastcall FormResize(TObject *Sender);
private:        // 用戶宣言
    TPoint FCurPos;
    int FEyeRudius;     //  瞳孔的大小
    TPoint FEyePos[2];     //  瞳孔的位置        void __fastcall TForm6::DrawEye(TRect R,int idx);
    TPoint __fastcall CalcEyePos(TRect R)const;    public:                // 用戶宣言
    __fastcall TForm6(TComponent* Owner);
};     
//辣醬油代碼
 
//---------------------------------------------------------------------------
__fastcall TForm6::TForm6(TComponent* Owner)
    : TForm(Owner)
{
    FEyeRudius = 10;
}    //---------------------------------------------------------------------------
//  表單眼球繪畫
void __fastcall TForm6::FormPaint(TObject *Sender)
{
    Canvas->Pen->Width = 4;
    Canvas->Pen->Style = psSolid;
    Canvas->Brush->Color = clWhite;
    Canvas->Ellipse(0,0,ClientWidth/2,ClientHeight);
    Canvas->Ellipse(ClientWidth/2,0,ClientWidth,ClientHeight);        DrawEye(Rect(0,0,ClientWidth/2,ClientHeight),0);
    DrawEye(Rect(ClientWidth/2,0,ClientWidth,ClientHeight),1);
}    //---------------------------------------------------------------------------
//  眼球描繪處理
void __fastcall TForm6::DrawEye(TRect R,int idx)
{
    TPoint org;  //0標點改變前的0標點
    int cx = R.Left   (R.Right-R.Left)/2;  //中心標點
    int cy = R.Top   (R.Bottom-R.Top)/2;        if(SetWindowOrgEx(Canvas->Handle,-cx,-cy,&org)==TRUE){
        //上次的位置有黑眼珠滅
        Canvas->Pen->Width = 1;
        Canvas->Pen->Style = psClear;
        Canvas->Brush->Color = clWhite;
        Canvas->Ellipse(FEyePos[idx].x-FEyeRudius,
                        FEyePos[idx].y-FEyeRudius,
                        FEyePos[idx].x FEyeRudius,
                        FEyePos[idx].y FEyeRudius);            //黑眼珠的位置的計算
        FEyePos[idx] = CalcEyePos(R);            //新黑眼珠的繪畫
        Canvas->Brush->Color = clBlack;
        Canvas->Ellipse(FEyePos[idx].x-FEyeRudius,
                        FEyePos[idx].y-FEyeRudius,
                        FEyePos[idx].x FEyeRudius,
                        FEyePos[idx].y FEyeRudius);
        //0標點取消
        SetWindowOrgEx(Canvas->Handle,org.x,org.y,0);
    }
}    //---------------------------------------------------------------------------
//  黑眼珠的位置的計算
TPoint __fastcall TForm6::CalcEyePos(TRect R)const
{
    double ex,ey,rx,ry,c,cx,cy;
    TPoint center;        rx = (R.Right-R.Left)/2;  //  眼的輪廓的符號
    ry = (R.Bottom-R.Top)/2;
    center.x = R.Left   rx;   //  中心標點
    center.y = R.Top   ry;
    rx -= FEyeRudius 2;     //  符號從眼球的大小拉
    ry -= FEyeRudius 2;
    cx = FCurPos.x - center.x;//  光標的位置研究
    cy = FCurPos.y - center.y;        if((cx*cx)/(rx*rx)   (cy*cy)/(ry*ry) < 1)//眼的公允(在~~中)光標有
      return Point(cx,cy);        if(cx!=0){                //  cx=0的時ex=∞腹足類爐缸用處
        c = cy/cx;
        ex = rx*ry / sqrt(fabs(ry*ry   rx*c*rx*c));
        if(cx < 0)            // 負的解
          ex *= -1;
        ey = ex*c;
    }else{
        ex = 0;
        ey = (FCurPos.y >= center.y) ? ry : -ry;
    }        return Point((int)ex,(int)ey);
}    //---------------------------------------------------------------------------
//  光標位置的取得
void __fastcall TForm6::Timer1Timer(TObject *Sender)
{
    TPoint pt;
    GetCursorPos(&pt);
    ::ScreenToClient(Handle,&pt);        if(FCurPos.x == pt.x && FCurPos.y == pt.y) return;
    FCurPos = pt;
    DrawEye(Rect(0,0,ClientWidth/2,ClientHeight),0);
    DrawEye(Rect(ClientWidth/2,0,ClientWidth,ClientHeight),1);
}    //---------------------------------------------------------------------------
void __fastcall TForm6::FormResize(TObject *Sender)
{
    Refresh();
}
//---------------------------------------------------------------------------
另外,這方法的附件軟件剛一出門爐缸應該省內存,處理的負荷也大茼蒿系井宇野前提有。
這樣的時雙緩沖區首都內使處理重表面的程序聯合爬毛馬千。
發表人 - conundrum 於 2005/02/19 19:53:41
附加檔案:65340_tips.rar
系統時間:2024-11-27 22:45:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!