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

本文介绍了如何在MFC应用中利用LButtonDown事件和鼠标移动事件实现在位图视图上绘制直线,同时记录并保存历史线条,避免清除已绘制的线条,以防止闪烁。
摘要由CSDN通过智能技术生成

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表示鼠标左键按下

MFC 实现鼠标拖动长轴以及获知椭圆,可以在控件的消息处理函数添加相应的代码。 首先,需要在控件的 WM_LBUTTONDOWN 消息记录下鼠标点击的位置,同时将一个标志位设置为 true,表示正在拖动长轴。在 WM_MOUSEMOVE 消息,如果标志位为 true,则计算长轴的长度,并重新绘制椭圆。在 WM_LBUTTONUP 消息,将标志位设置为 false,表示停止拖动长轴。 代码如下: ```c++ void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point) { // 记录鼠标点击的位置 m_startPoint = point; // 设置标志位,表示正在拖动长轴 m_isDragging = true; CWnd::OnLButtonDown(nFlags, point); } void CMyWnd::OnMouseMove(UINT nFlags, CPoint point) { if (m_isDragging) { // 计算长轴的长度 int dx = point.x - m_startPoint.x; int dy = point.y - m_startPoint.y; int a = sqrt(dx * dx + dy * dy); // 重新绘制椭圆 m_a = a; Invalidate(); } CWnd::OnMouseMove(nFlags, point); } void CMyWnd::OnLButtonUp(UINT nFlags, CPoint point) { // 设置标志位,表示停止拖动长轴 m_isDragging = false; CWnd::OnLButtonUp(nFlags, point); } ``` 在这段代码,m_startPoint 是记录鼠标点击位置的成员变量,m_isDragging 是记录是否正在拖动长轴的标志位,m_a 是椭圆的长轴长度。在 WM_LBUTTONDOWN 消息记录鼠标点击位置,并设置标志位为 true,在 WM_MOUSEMOVE 消息计算长轴长度并重新绘制椭圆,在 WM_LBUTTONUP 消息设置标志位为 false。 需要注意的是,这段代码的计算长轴长度是简化的,实际上需要根据鼠标拖动的方向来计算长轴长度。另外,为了让控件重新绘制,需要调用 Invalidate() 函数。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值