MFC中LButtonDown下拖动鼠标绘制直线

来源:互联网 发布:足彩过滤软件下载 编辑:程序博客网 时间:2024/05/18 03:31

MFC中LButtonDown下拖动鼠标绘制直线

最近做一个项目,需要一个在绘制位图的视图上画直线,具体要求是按住鼠标左键拖动,然后放开左键绘制出一条直线。(下一次绘制时,不能清除上一次绘制的直线)。

具体思路如下:

(1).当鼠标左键按下时,记录下鼠标的位置,并设置一个标记记录下鼠标左键DOWN(当鼠标左键UP时,设置为UP);

(2).要实时绘制直线,则需要在鼠标移动时,刷新绘制;

(3).由于下一次绘制不能清除上一次绘制的直线,那么在刷新绘制时则需要用一个数组保存下前面绘制的直线,在每次刷新前将以前绘制的直线绘制出来;

(4).将最后一次绘制的直线保存到数组中;

(5).由于绘制较多直线,屏幕会闪射,则需要创建内存缓存DC来绘图;

具体代码实现:

(1).

A在鼠标左键按下消息中:

voidCDrawLineView::OnLButtonDown(UINT nFlags, CPoint point)

{

         m_Start.x = point.x;  //保存鼠标左键按下时坐标,为直线的起点坐标

         m_Start.y = point.y;

         m_LbuttonFlag = 1;  //设置鼠标左键按下标志,为1表示鼠标左键按下

B当鼠标左键UP时,则停止绘制:

voidCDrawLineView::OnLButtonUp(UINT nFlags, CPoint point)

{

         m_LbuttonFlag = 0;  //当值为0时,表示鼠标左键UP

         if(m_ALine.front == m_ALine.size ||m_ALine.front > m_ALine.size)

         {

                   LINE* line = newLINE[m_ALine.size+20];

                   if(!line)

                            return;

                   for(int j = 0; j <m_ALine.front; j++)

                   {

                            line[j].start =m_ALine.position[j].start;

                            line[j].stop =m_ALine.position[j].stop;

                   }

                   if(m_ALine.position)

                            delete[]m_ALine.position;

                   m_ALine.position = line;

                   m_ALine.size+=20;

         }

         m_ALine.position[m_ALine.front].start =m_Start;  //将当前的直线存放到数组之中

         m_ALine.position[m_ALine.front].stop =m_Stop;

         m_ALine.front++;

}

 

(2).鼠标左键按下同时移动鼠标,则绘制直线:

voidCDrawLineView::OnMouseMove(UINT nFlags, CPoint point)

{

         m_Stop.x = point.x;  //每次鼠标移动,会导致直线终点坐标改变

         m_Stop.y = point.y;

         if(m_LbuttonFlag==1)  //当鼠标移动时,如果鼠标左键也是按下,则刷新绘制直线

         {

                   Invalidate(TRUE);

         }

}

(3).每次刷新绘制都需要将前面绘制的直线重新绘制到屏幕中:

voidCDrawLineView::OnDraw(CDC* pDC)

{

         CDrawLineDoc* pDoc = GetDocument();

         ASSERT_VALID(pDoc);

         //将存储直线全部绘制出来

         for(int i = 0; i < m_ALine.front;i++)

         {

                   pDC->MoveTo(m_ALine.position[i].start);

                   pDC->LineTo(m_ALine.position[i].stop);

         }

         //如果鼠标左键按下,则绘制直线

         if(m_LbuttonFlag == 1)

         {

//绘制直线   

                 pDC->MoveTo(m_Start); 

                 pDC->LineTo(m_Stop);

         }

}

(4).由于鼠标移动就刷新屏幕,会出现闪屏,则需要使用内存DC来缓存,关于解决闪屏问题使用缓存DC,请参考其它文章。

原创粉丝点击