MFC一路走来------鼠标响应

    技术2024-08-08  66

    鼠标响应关键就是对两个函数进行操作:OnLButtonDown和OnLButtonUp;

    1、使用MFC AppWizard(exe)建立一个单文档MFC工程

    2、首先要在CxxxView类的定义里加上后续必备的数据成员

    class CDrawView : public CView { 。。。。。。。。。。。。 private:  CPoint m_ptOrigin;      //用来记录鼠标按下时的点            BOOL m_bDraw;           //鼠标按下的标志,用来判断鼠标弹起来了没有  CPoint m_ptOld;         //用来记录鼠标的移动路劲 };

     

    void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) //鼠标按下 {   MessageBox("Haibara Ai");            //鼠标一按下就会送出消息(以对话框形式)   m_ptOrigin=m_ptOld=point;            //将当前鼠标按下的位置用m_ptOrigin记录   m_bDraw=TRUE;                        //将鼠标按下标志置为TURE   CView::OnLButtonDown(nFlags, point); //函数自调用,循环检测。nFlags 表示控制键状态

                                            //(包括 ctrl,shift,鼠标左、中、右共5个键的状态)                                         //point表示鼠标坐标。(相对于当前窗口而言的坐标)

    }

    void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) //鼠标弹起 {

    //鼠标画直线方式一  HDC hdc;                         //先定义一个HDC对象:Handler to a device context(DC),指向一个DC(设备描述表)的句柄  hdc=::GetDC(m_hWnd);//“::”用全局的函数(即SDK中的函数)

     MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);   //由原点(0,0)移动到起点(即鼠标按下点)  LineTo(hdc,point.x,point.y);                                         //由当前位置移动到坐标点(x,y)(即鼠标弹起点);  ::ReleaseDC(m_hWnd,hdc);                                       //释放DC

     

     

    //鼠标画直线方式二  

    CWnd::GetDC

    CDC* GetDC( );

    Return Value

    Identifies the device context for the CWnd client area if successful; otherwise, the return value is NULL. The pointer may be temporary and should not be stored for later use.

    CDC *pDC=GetDC();                      //获取一个CDC类对象的指针  pDC->MoveTo(m_ptOrigin);  pDC->LineTo(point);  ReleaseDC(pDC);

     

    //鼠标画直线方式三 // CClientDC dc(this);                                  //在客户区画直线  CClientDC dc(GetParent());                      //在框架窗口上画直线  dc.MoveTo(m_ptOrigin);  dc.LineTo(point);

     

    //鼠标画直线方式四

    // CWindowDC dc(this);                                 //在客户区画直线 // CWindowDC dc(GetParent());                   //在框架窗口上画直线    CWindowDC dc(GetDesktopWindow());  //在整个桌面面板上画直线    dc.MoveTo(m_ptOrigin);    dc.LineTo(point);

     

    //鼠标画直线方式五(画笔)

     CPen pen(PS_SOLID,20,RGB(255,0,0));        //创建一个笔(CPen类封装了跟画笔相关的操作)

                                                                                       //(线型,线粗,线色)  CClientDC dc(this);                                                //创建一个DC  CPen *pOldPen=dc.SelectObject(&pen);           //将笔选到设备描述表中  dc.MoveTo(m_ptOrigin);  dc.LineTo(point);  dc.SelectObject(pOldPen);

     

    //鼠标响应画矩形(画刷)  CBrush brush(RGB(255,0,0));                //创建画刷,红色  CClientDC dc(this);                          //创建一个dc  dc.FillRect(CRect(m_ptOrigin,point),&brush); //用一个指定画刷填充一个指定的区域,                     //第一个参数用于设定这个区域,用画线时保存下来的起点和终点来设定这个区域

     //运行结果是:我们的dc在用我们所创建的红色的画刷去填充了一块矩形的区域

     

    //用位图对象填充鼠标画出的矩形框图 CBitmap  bitmap;              //首先定义一个位图  bitmap.LoadBitmap(IDB_BITMAP1); //用资源的ID加载这个位图  CBrush  brush(&bitmap);   //有了这个位图之后,就可以创建这个位图的画刷,形参为这个位图对象的指针  CClientDC dc(this);                              //然后创建一个dc                              dc.FillRect(CRect(m_ptOrigin,point),&brush);     //用这个指定的画刷(位图画刷)去填充一块矩形区

     

     

    ///创建透明画刷,即空画刷    /  CClientDC dc(this);     CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));  //注意这里,GetStockObject函数返回的是一个HGDIOBJ  //的一个句柄,需要用强制转换将其转换为画刷的句柄  //(HBRUSH)GetStockObject(NULL_BRUSH)  //FromHandle是CBrush类的静态成员函数(见MSDN),所以可以直接由类名调用  CBrush *pOldBrush=dc.SelectObject(pBrush);     //将画刷选到我们的设备描述表中,

                                                                                        //用空画刷去替换我们先前的画刷(缺省画刷、默认画刷)  dc.Rectangle(CRect(m_ptOrigin,point));         //DC当中用来画矩形矩形的一个函数  dc.SelectObject(pOldBrush);                   //回到画刷替换前的默认画刷   m_bDraw=FALSE;                  //鼠标弹起标志,将m_bDraw置为FALSE

      CView::OnLButtonUp(nFlags, point); }

     

     

    //鼠标移动响应函数,应用在画曲线方面

    void CDrawView::OnMouseMove(UINT nFlags, CPoint point)  //point为函数获取的当前鼠标所在位置的坐标

                                                            //它会鼠标的移动而不断改变值 {     CClientDC dc(this);                   //创建一个DC,指向当前窗口(客户区)     dc.SetROP2(R2_BLACK);                 //设置绘画模式     CPen pen(PS_SOLID,1,RGB(255,0,0));    //设置画笔(线型、线宽、线颜色)     CPen  *pOldPen=dc.SelectObject(&pen); //将画笔选到设备描述表中  if(m_bDraw==TRUE)  {

      ///   ///画曲线   dc.MoveTo(m_ptOrigin); //移动到起始点    dc.LineTo(point);       //画线到,注意这里的每一次画线都是很短的。很短的多次画线就得到了曲线   m_ptOrigin=point;       //将终点设为下一次画线的起点。。。。这样不断循环,直到鼠标弹起,跳出循环结束画线。   //

      //   ///画扇形线   dc.MoveTo(m_ptOrigin); //定下起点不变    dc.LineTo(point);       //

      //   //画带边线的扇形线   dc.MoveTo(m_ptOrigin);    //定下起点不变    dc.LineTo(point);          //开始画线   dc.LineTo(m_ptOld);        //在线的终点处引线到另一条线的终点   m_ptOld=point;             //将上一条线的终点寄存下,以待下一条线划下时,将终点与之相连。     //

     }

       dc.SelectObject(pOldPen);   //回到画刷替换前的默认画笔

      CView::OnMouseMove(nFlags, point);//函数自调用,循环检测。nFlags 表示控制键状态

                                       //(包括 ctrl,shift,鼠标左、中、右共5个键的状态)                                    //point表示鼠标坐标。(相对于当前窗口而言的坐标)

    }

    最新回复(0)