<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    VC實現圖片拖拽及動畫

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    基礎知識 
    1.PictureBox控件的使用 
    2.加載位圖文件 
    1.通過文件路徑獲得位圖句柄 
    //獲得位圖句柄  
    void CMovePictureDlg::GetHandleFromPath(CString path)  
     
        hBitmap= (HBITMAP)::LoadImage(AfxGetInstanceHandle(),path,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);//創建位圖句柄  

    2.通過位圖句柄創建位圖對象并獲得位圖信息 
    //獲取位圖對象  
      
    void CMovePictureDlg::GetBitMap(HBITMAP hBitmap)  
      
     
      
       m_BitMap.Attach(hBitmap);//通過位圖句柄創建位圖對象  
      
      
        //獲取圖像信息  
      
        BITMAPINFOHEADER bminfo;   
      
        m_BitMap.GetObject(sizeof(bminfo),&bminfo);   
      
      
    //獲取位圖寬高  
      
        m_nBmpWidth=bminfo.biWidth;  
      
        m_nBmpHeight=bminfo.biHeight;  
      
    }
     

    實現步驟: 
    1.創建一個對話框工程命名為MovePicture 
    2.打開對話框資源拖入一個PictureBox控件,設置ID為:IDC_PICTUREBOX,設置類型為:位圖 
    3.拖入兩個靜態文本控件和兩個編輯框控件,靜態文本控件標題分別為:輸入動量系數:、輸入阻力系數:,編輯框ID分別為:IDC_EDITDV、IDC_EDITF,為IDC_EDITDV關聯變量為:m_editDV,為IDC_EDITF關聯變量為:m_editF 
    4.實現代碼 
    頭文件 
    // MovePictureDlg.h : header file  
    //  
    #include "PictureBox.h"  
      
    #if !defined(AFX_MOVEPICTUREDLG_H__6FFC1DDF_478C_43D6_B854_4D51E98D5E50__INCLUDED_) 
    #define AFX_MOVEPICTUREDLG_H__6FFC1DDF_478C_43D6_B854_4D51E98D5E50__INCLUDED_ 
      
    #if _MSC_VER > 1000  
    #pragma once  
    #endif // _MSC_VER > 1000  
      
    /////////////////////////////////////////////////////////////////////////////  
    // CMovePictureDlg dialog  
      
    class CMovePictureDlg : public CDialog  
     
    // Construction  
    public:  
        void GetBitMap(HBITMAP hBitmap);  
        void GetHandleFromPath(CString path);  
        void SetPicRect(int x,int y);  
        void SetSysPath();  
        CMovePictureDlg(CWnd* pParent = NULL);  // standard constructor  
      
    // Dialog Data  
        //{{AFX_DATA(CMovePictureDlg)  
        enum { IDD = IDD_MOVEPICTURE_DIALOG };  
        CEdit   m_editF;  
        CEdit   m_editDV;  
        //}}AFX_DATA  
      
        // ClassWizard generated virtual function overrides  
        //{{AFX_VIRTUAL(CMovePictureDlg)  
        protected:  
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support  
        //}}AFX_VIRTUAL  
      
    // Implementation  
    protected:  
        HICON m_hIcon;  
      
        // Generated message map functions  
        //{{AFX_MSG(CMovePictureDlg)  
        virtual BOOL OnInitDialog();  
        afx_msg void OnSysCommand(UINT nID, LPARAM lParam);  
        afx_msg void OnPaint();  
        afx_msg HCURSOR OnQueryDragIcon();  
        afx_msg void OnLButtonDown(UINT nFlags, CPoint point);  
        afx_msg void OnMouseMove(UINT nFlags, CPoint point);  
        afx_msg void OnLButtonUp(UINT nFlags, CPoint point);  
        afx_msg void OnTimer(UINT nIDEvent);  
        afx_msg void OnDestroy();  
        //}}AFX_MSG  
        DECLARE_MESSAGE_MAP()  
    private:  
        CString sysPath;//保存系統路徑  
        CString bmpPath;//位圖路徑  
      
        HBITMAP hBitmap;//位圖句柄  
        CBitmap m_BitMap;//位圖對象  
        int m_nBmpWidth;//位圖寬度  
        int m_nBmpHeight;//位圖高度  
      
        CPictureBox* pictureBox;//圖片控件  
        CRect picRect;//控件所占區域  
        BOOL isSelect;//判斷控件是否被選中  
      
        BOOL isDown;//判斷鼠標是否按下  
      
        CPoint oldPoint;//鼠標原始位置  
      
        CPoint startPoint;//移動起始位置  
      
        SYSTEMTIME startTime;//開始時間  
        SYSTEMTIME endTime;//結束時間  
      
        double vx;//x方向速度  
        double vy;//y方向速度  
      
        double f;//阻力  
        double dv;//動力增量  
      
        CRect clientRect;//客戶區域  
    };  
      
    //{{AFX_INSERT_LOCATION}}  
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.  
      
    #endif // !defined(AFX_MOVEPICTUREDLG_H__6FFC1DDF_478C_43D6_B854_4D51E98D5E50__INCLUDED_)
     

    實現文件 
    // MovePictureDlg.cpp : implementation file  
    //  
      
    #include "stdafx.h"  
    #include "MovePicture.h"  
    #include "MovePictureDlg.h"  
    #include <math.h>  
      
    #ifdef _DEBUG  
    #define new DEBUG_NEW  
    #undef THIS_FILE  
    static char THIS_FILE[] = __FILE__;  
    #endif  
      
    /////////////////////////////////////////////////////////////////////////////  
    // CAboutDlg dialog used for App About  
      
    //計算時間差   
    inline   __int64   TimeDiff(SYSTEMTIME left,SYSTEMTIME right)   
    {   
        CTime   tmLeft(left.wYear,left.wMonth,left.wDay,0,0,0);   
        CTime   tmRight(left.wYear,left.wMonth,left.wDay,0,0,0);   
        CTimeSpan   sp;   
        sp   =   tmLeft   -   tmRight;//計算日期比較麻煩,就交給MFC去做吧   
        long   lLMinllis   =   (left.wHour*3600   +   left.wMinute*60   +   left.wSecond)*1000   +   left.wMilliseconds;   
        long   lRMinllis   =   (right.wHour*3600   +   right.wMinute*60   +   right.wSecond)*1000   +   right.wMilliseconds;   
      
        return   (__int64)sp.GetDays()*86400000   +   (lLMinllis   -   lRMinllis);  
     
      
    class CAboutDlg : public CDialog  
     
    public:  
        CAboutDlg();  
      
    // Dialog Data  
        //{{AFX_DATA(CAboutDlg)  
        enum { IDD = IDD_ABOUTBOX };  
        //}}AFX_DATA  
      
        // ClassWizard generated virtual function overrides  
        //{{AFX_VIRTUAL(CAboutDlg)  
        protected:  
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support  
        //}}AFX_VIRTUAL  
      
    // Implementation  
    protected:  
        //{{AFX_MSG(CAboutDlg)  
        //}}AFX_MSG  
        DECLARE_MESSAGE_MAP()  
    };  
      
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)  
     
        //{{AFX_DATA_INIT(CAboutDlg)  
        //}}AFX_DATA_INIT  
     
      
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)  
     
        CDialog::DoDataExchange(pDX);  
        //{{AFX_DATA_MAP(CAboutDlg)  
        //}}AFX_DATA_MAP  
     
      
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)  
        //{{AFX_MSG_MAP(CAboutDlg)  
            // No message handlers  
        //}}AFX_MSG_MAP  
    END_MESSAGE_MAP()  
      
    /////////////////////////////////////////////////////////////////////////////  
    // CMovePictureDlg dialog  
      
    CMovePictureDlg::CMovePictureDlg(CWnd* pParent /*=NULL*/)  
        : CDialog(CMovePictureDlg::IDD, pParent)  
     
        //{{AFX_DATA_INIT(CMovePictureDlg)  
        //}}AFX_DATA_INIT  
        // Note that LoadIcon does not require a subsequent DestroyIcon in Win32  
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);  
      
        isDown = FALSE;//初始化鼠標按下狀態  
        isSelect = FALSE;//初始化選中狀態  
        f = 0.05;//初始化阻力  
        dv = 5;//初始化動力增量  
     
      
    void CMovePictureDlg::DoDataExchange(CDataExchange* pDX)  
     
        CDialog::DoDataExchange(pDX);  
        //{{AFX_DATA_MAP(CMovePictureDlg)  
        DDX_Control(pDX, IDC_EDITF, m_editF);  
        DDX_Control(pDX, IDC_EDITDV, m_editDV);  
        //}}AFX_DATA_MAP  
     
      
    BEGIN_MESSAGE_MAP(CMovePictureDlg, CDialog)  
        //{{AFX_MSG_MAP(CMovePictureDlg)  
        ON_WM_SYSCOMMAND()  
        ON_WM_PAINT()  
        ON_WM_QUERYDRAGICON()  
        ON_WM_LBUTTONDOWN()  
        ON_WM_MOUSEMOVE()  
        ON_WM_LBUTTONUP()  
        ON_WM_TIMER()  
        ON_WM_DESTROY()  
        //}}AFX_MSG_MAP  
    END_MESSAGE_MAP()  
      
    /////////////////////////////////////////////////////////////////////////////  
    // CMovePictureDlg message handlers  
      
    //對話框初始化  
    BOOL CMovePictureDlg::OnInitDialog()  
     
        CDialog::OnInitDialog();  
      
        // Add "About…" menu item to system menu.  
      
        // IDM_ABOUTBOX must be in the system command range.  
        ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);  
        ASSERT(IDM_ABOUTBOX < 0xF000);  
      
        CMenu* pSysMenu = GetSystemMenu(FALSE);  
        if (pSysMenu != NULL)  
        {  
            CString strAboutMenu;  
            strAboutMenu.LoadString(IDS_ABOUTBOX);  
            if (!strAboutMenu.IsEmpty())  
            {  
                pSysMenu->AppendMenu(MF_SEPARATOR);  
                pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);  
            }  
        }  
      
        // Set the icon for this dialog.  The framework does this automatically  
        //  when the application’s main window is not a dialog  
        SetIcon(m_hIcon, TRUE);         // Set big icon  
        SetIcon(m_hIcon, FALSE);        // Set small icon  
          
        // TODO: Add extra initialization here  
      
        pictureBox = (CPictureBox*)GetDlgItem(IDC_PICTUREBOX);//獲得圖片框指針  
      
        SetSysPath();//設置系統路徑  
      
        bmpPath = sysPath+"http://image.bmp";//設置位圖路徑  
      
        GetHandleFromPath(bmpPath);//創建位圖句柄  
      
        GetBitMap(hBitmap);//獲得位圖  
      
        //設置位圖控件區域  
        SetPicRect(0,0);  
      
        pictureBox->MoveWindow(picRect);//設置控件位置  
      
        //設置文本框值  
        CString strDV,strF;  
        strDV.Format("%f",dv);  
        strF.Format("%f",f);  
      
        m_editDV.SetWindowText(strDV);  
        m_editF.SetWindowText(strF);  
        return TRUE;  // return TRUE  unless you set the focus to a control  
     
      
    void CMovePictureDlg::OnSysCommand(UINT nID, LPARAM lParam)  
     
        if ((nID & 0xFFF0) == IDM_ABOUTBOX)  
        {  
            CAboutDlg dlgAbout;  
            dlgAbout.DoModal();  
        }  
        else  
        {  
            CDialog::OnSysCommand(nID, lParam);  
        }  
     
      
    // If you add a minimize button to your dialog, you will need the code below  
    //  to draw the icon.  For MFC applications using the document/view model,  
    //  this is automatically done for you by the framework.  
      
    //重繪函數  
    void CMovePictureDlg::OnPaint()   
     
        if (IsIconic())  
        {  
            CPaintDC dc(this); // device context for painting  
      
            SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);  
      
            // Center icon in client rectangle  
            int cxIcon = GetSystemMetrics(SM_CXICON);  
            int cyIcon = GetSystemMetrics(SM_CYICON);  
            CRect rect;  
            GetClientRect(&rect);  
            int x = (rect.Width() – cxIcon + 1) / 2;  
            int y = (rect.Height() – cyIcon + 1) / 2;  
      
            // Draw the icon  
            dc.DrawIcon(x, y, m_hIcon);  
        }  
        else  
        {  
      
            this->GetClientRect(&clientRect);//獲得客戶區域大小  
      
            pictureBox->SetBitmap(hBitmap);//顯示位圖  
            CDialog::OnPaint();  
        }  
          
     
      
    // The system calls this to obtain the cursor to display while the user drags  
    //  the minimized window.  
    HCURSOR CMovePictureDlg::OnQueryDragIcon()  
     
        return (HCURSOR) m_hIcon;  
     
      
    //鼠標左鍵按下  
    void CMovePictureDlg::OnLButtonDown(UINT nFlags, CPoint point)   
     
        // TODO: Add your message handler code here and/or call default  
          
        isDown=TRUE;//鼠標按下  
      
        if(PtInRect(picRect,point))//鼠標在圖片區域按下  
        {  
            isSelect=TRUE;//圖片選中  
      
            oldPoint = point;//記錄下鼠標位置  
            startPoint = point;//記錄下鼠標起始位置  
      
            GetSystemTime(&startTime);//得到當前時間  
        }  
      
        CDialog::OnLButtonDown(nFlags, point);  
     
      
    //鼠標左鍵彈起  
    void CMovePictureDlg::OnLButtonUp(UINT nFlags, CPoint point)   
     
        // TODO: Add your message handler code here and/or call default  
          
        isDown=FALSE;//鼠標彈起  
      
        if(isSelect)  
        {  
            CString strDV,strF;  
            m_editDV.GetWindowText(strDV);  
            m_editF.GetWindowText(strF);  
      
            dv = atof(strDV);  
            f = atof(strF);   
      
            isSelect=FALSE;//釋放圖片  
      
            GetSystemTime(&endTime);//得到當前時間  
      
            double dx = point.x-startPoint.x;//計算x軸位移  
            double dy = point.y-startPoint.y;//計算y軸位移  
      
            int s = TimeDiff(endTime,startTime);//計算時間差  
      
            //double r = sqrt(dx*dx+dy*dy);//計算鼠標位移長度  
            //double v=r/s;//求平均速度  
      
            vx=dv*dx/s;//x軸平均速度  
            vy=dv*dy/s;//y軸平均速度  
      
            SetTimer(1,1,NULL);//設置定時器  
        }  
      
        CDialog::OnLButtonUp(nFlags, point);  
     
      
    //鼠標移動  
    void CMovePictureDlg::OnMouseMove(UINT nFlags, CPoint point)   
     
        // TODO: Add your message handler code here and/or call default  
      
        if(isDown&&isSelect)//在鼠標按下狀態下移動  
        {  
            int dx = point.x-oldPoint.x;//計算x值的相對變化  
            int dy = point.y-oldPoint.y;//計算y值的相對變化  
      
            //重新設置PictureBox位置  
            picRect.left=picRect.left+dx;  
            picRect.top=picRect.top+dy;  
      
            SetPicRect(picRect.left,picRect.top);//重置圖片位置  
      
            pictureBox->MoveWindow(picRect.left,picRect.top,m_nBmpWidth,m_nBmpHeight);//改變圖片框大小  
      
            oldPoint=point;//重置原始坐標  
        }  
      
        CDialog::OnMouseMove(nFlags, point);  
     
      
    //設置系統路徑  
    void CMovePictureDlg::SetSysPath()  
     
        //獲取當前路徑,保存到字符數組strBuff中  
        char strBuff[256];  
        GetCurrentDirectory(256,strBuff);   
        sysPath.Format("%s",strBuff);//將路徑保存到全局變量中  
     
      
    //設置控件區域  
    void CMovePictureDlg::SetPicRect(int x, int y)  
     
        picRect.top=y;  
        picRect.bottom=picRect.top+m_nBmpHeight;  
        picRect.left=x;  
        picRect.right=picRect.left+m_nBmpWidth;  
     
      
    //獲得位圖句柄  
    void CMovePictureDlg::GetHandleFromPath(CString path)  
     
        hBitmap= (HBITMAP)::LoadImage(AfxGetInstanceHandle(),path,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);//創建位圖句柄  
     
      
    //獲取位圖對象  
    void CMovePictureDlg::GetBitMap(HBITMAP hBitmap)  
     
       m_BitMap.Attach(hBitmap);//通過位圖句柄創建位圖對象  
      
        //獲取圖像信息  
        BITMAPINFOHEADER bminfo;   
        m_BitMap.GetObject(sizeof(bminfo),&bminfo);   
      
        //獲取位圖寬高  
        m_nBmpWidth=bminfo.biWidth;  
        m_nBmpHeight=bminfo.biHeight;  
     
      
    //定時器事件  
    void CMovePictureDlg::OnTimer(UINT nIDEvent)   
     
        // TODO: Add your message handler code here and/or call default  
      
        if(abs(vx)>abs(vy))//當水平速度大于垂直速度時,只改變水平方向增量  
        {  
            if(picRect.left==clientRect.left)  
            {  
                vx=-vx;  
            }  
            if(picRect.left==clientRect.right-m_nBmpWidth)  
            {  
                vx=-vx;  
            }  
            picRect.left+=vx;  
        }  
        else if(abs(vx)<abs(vy))//當水平速度小于垂直速度時,只改變垂直方向增量  
        {  
            if(picRect.top==clientRect.top)  
            {  
                vy=-vy;  
            }  
            if(picRect.top==clientRect.bottom-m_nBmpHeight)  
            {  
                vy=-vy;  
            }  
            picRect.top+=vy;  
        }  
      
        //邊界判斷  
        if(picRect.left<clientRect.left)  
        {  
            picRect.left=clientRect.left;  
        }  
        if(picRect.left>clientRect.right-m_nBmpWidth)  
        {  
            picRect.left=clientRect.right-m_nBmpWidth;  
        }  
        if(picRect.top<clientRect.top)  
        {  
            picRect.top=clientRect.top;  
        }  
        if(picRect.top>clientRect.bottom-m_nBmpHeight)  
        {  
            picRect.top=clientRect.bottom-m_nBmpHeight;  
        }  
      
        pictureBox->MoveWindow(picRect.left,picRect.top,m_nBmpWidth,m_nBmpHeight);//改變圖片框大小  
      
        //增量遞減,勻減速運動  
        if(vx>0)  
        {  
            vx-=f;  
            if(vx<0)  
            {  
                vx=0;  
            }  
        }  
        else if(vx<0)  
        {  
            vx+=f;  
            if(vx>0)  
            {  
                vx=0;  
            }  
        }  
      
        if(vy>0)  
        {  
            vy-=f;  
            if(vy<0)  
            {  
                vy=0;  
            }  
        }  
        else if(vy<0)  
        {  
            vy+=f;  
            if(vy>0)  
            {  
                vy=0;  
            }  
        }  
      
        SetPicRect(picRect.left,picRect.top);//重置圖片位置  
      
        CDialog::OnTimer(nIDEvent);  
     
      
    void CMovePictureDlg::OnDestroy()   
     
        CDialog::OnDestroy();  
          
        // TODO: Add your message handler code here  
        this->KillTimer(1);//銷毀定時器  
    }
     

    1.在對話框中添加一PictureBox控件,設置ID為IDC_PICTUREBOX,類型為位圖 
    2.創建CPictureBox類繼承于CStatic 
    3.在對話框類中聲明 
    CPictureBox* pictureBox;//圖片控件 
    4.在對話框類的OnInitDialog方法中獲得控件指針 
    pictureBox = (CPictureBox*)GetDlgItem(IDC_PICTUREBOX);//獲得圖片框指針 
    5.顯示位圖 
    pictureBox->SetBitmap(hBitmap);//顯示位圖 
    6.設置控件位置 
    pictureBox->MoveWindow(picRect);//設置控件位置

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全