MFC中LButtonDown下拖动鼠标绘制直线
2013-09-26 23:13
861 查看
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,请参考其它文章。
相关文章推荐
- 在MFC下绘制直线,使用橡皮筋技术,可以使直线效果跟随鼠标移
- Graphics类绘制直线与拖动
- MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- 使用JavaScript和DIV实现WebGIS中的鼠标拖动绘制矩形
- 用canvas实现鼠标拖动绘制矩形框
- 用canvas实现鼠标拖动绘制矩形框
- C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框
- MFC学习——鼠标拖动无标题栏的对话框
- 用rust + glium实现的一个绘制3D茶壶并实现鼠标拖动旋转的demo
- 用canvas实现鼠标拖动绘制矩形框
- 拖动鼠标绘制椭圆
- MFC GDI+实现以鼠标为中心缩放图片(并且可以拖动)
- 用canvas实现鼠标拖动绘制矩形框
- MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- 使用MFC进行编程,绘制直线椭圆以及样条曲线
- MFC在鼠标自定义的一定的范围内实现拖动窗口移动、错误:不支持尝试执行的操作、实现进度条颜色的渐变或者背景和前景色的改变
- MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- MFC实现鼠标跟踪画直线
- 用canvas实现鼠标拖动绘制矩形框