vc画线的一点问题

tyanfeng_00 2012-08-18 03:42:14
我想用vc的MFC画一条线,要求画在OnDraw里面,并在画线的时候显示鼠标移动.
...全文
127 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hj976122401 2012-08-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
可不可以具体点,我就准备通过OnLbuttonDown OnMouseMove OnLButtonUp函数来实现直线的绘制,但是具体怎么搞不是很明白.
[/Quote]

要一直让鼠标显示的话可以将设置鼠标光标的属性,可以用LoadStandardCursor()这个函数来设置光标的形状。然后在鼠标按下OnLButtonDown()函数里调用SetCapture()和SetCursor()来获取光标。接下来你再在OnLbuttonDown OnMouseMove OnLButtonUp添加你想划线的程序就可以了。

下面这个是我们VC课考试的编程题,你可以参考一下:

题目:用MFC做一个画线程序,要求:1,鼠标按下画线时鼠标成十字形一直显示;2,鼠标弹起时结束画线

下面是我的程序:

首先创建一个工程名为Draw的单文档程序

一、在CDrawView头文件里加上几个参数:

class CDrawView : public CView
{
protected: // create from serialization only
CDrawView();
DECLARE_DYNCREATE(CDrawView)
int m; //m用来判断鼠标是否按下
CPoint p1, p2; //p1,p2是记录两个点,画线时从p1到p2
HCURSOR m_hMyCursor; //定义光标类型
}

二、在初始化函数CDrawView里添加如下代码:

m = 0;//初始化变量,表示鼠标没有按下

m_hMyCursor = AfxGetApp()->LoadStandardCursor (MAKEINTRESOURCE(IDC_CROSS));//设置光标的形状

AfxGetApp->LoadStandardCursor();//加载光标,IDC_CROSS表示十字形


三、设置消息鼠标按下时,SetCapture();函数捕获光标。

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
SetCapture();//捕获光标
SetCursor(m_hMyCursor);//m_hMyCursor 在初始化时已经将他设置成十字形了
CClientDC dc(this);
m = 1; //表示鼠标已按下
p1 = point;
}

四、设置鼠标消息当鼠标弹起时

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
p2 = point;
CClientDC dc(this);
OnPrepareDC(&dc);
dc.MoveTo (p1);
dc.LineTo (p2);
m = 0; //表示鼠标已弹起
ReleaseCapture();//释放光标
}

五、添加设置鼠标移动过程的功能函数

void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
static int n = 0;
switch(++n)
{
case 1:
p2 = point;
break;
case 2:
p1 = p2;
p2 = point;
n = 0;
break;
}
CClientDC dc(this);
OnPrepareDC(&dc);
if(1 == m) //如果鼠标按下,则画线
{
dc.MoveTo (p1);
dc.LineTo (p2);
}
CView::OnMouseMove(nFlags, point);
}


希望对你有帮助!
tyanfeng_00 2012-08-18
  • 打赏
  • 举报
回复
可不可以具体点,我就准备通过OnLbuttonDown OnMouseMove OnLButtonUp函数来实现直线的绘制,但是具体怎么搞不是很明白.
starhuhu 2012-08-18
  • 打赏
  • 举报
回复
如果 这样 光靠OnDraw是完不成任务的,
需要 定义全局鼠标位置的变量,
在OnLbuttonDown OnMouseMove OnLButtonUp中 改变这个变量
然后 在OnDraw里面绘制这个变量 ,记得擦出前面绘制的痕迹。

还有 要不断刷新OnDraw,因为OnDraw不会连续刷新的
  • 打赏
  • 举报
回复
貌似说的就是橡皮筋
如果你需要的话
可以把MFC windows编程那里的例子拿出来看下
有现成的
starhuhu 2012-08-18
  • 打赏
  • 举报
回复
是不是 像橡皮筋一样的东西, 楼主说 鼠标移动,鼠标一直都在移动 啊 ?
描述清楚点
可以作为课程设计的程序,实现简单的绘图,移动图形的功能。 使用vc框架实现。 GHpaint程序的几个重点 程序的基本功能: 程序提供绘图、删除已绘图形、移动已绘图形。 可以选择绘图颜色、形状、线粗。 重点问题: 1、 程序设计基于面向对象。 程序中所有图形都从基类CShapebase派生,大部分工作(例如:删除、移动等)都在这个基类中完成。此类中的两个纯需函数: //纯需函数DrawShape,每个基类都必须实现的函数。 //指定不同图形的绘制方法。 virtual void DrawShape(CDC* pdc) = 0; //橡皮筋效果的算法函数 virtual void ZoomShape(CDC *pdc) = 0; 这两个函数需要在派生类中重载。这两个函数中主要实现不同图形的绘制方法。 也就是说,不同图形的不同点只有绘制方法不同,其他所有属性和行为都可以统一处理。 这里的继承体现了面向对象的设计,论文中可以体现这一点。 2、 动态模板库对象CPtList的使用,动态模板库基础知识。 CPtList是动态模板库的一个实例化类。功能是以链表形式保存指针,至于指针类型不做要求,需要程序员自己设计。 本程序CPtList对象中保存所有图形对象指针,由于所有图形都从CShapebase派生,所以所有图形指针都可以转化为基类CShapebase指针后保存在CPtList中。以后再遍历列表,调用图形对象函数时出现了多态调用。这里体现面向对象程序的多态,论文中可以说明。 至于CPtList的使用,可以在网上查查,可以看看程序代码,比较简单。 多态:是一种函数调用形式。出现在类继承情况下。详细的多态定义到网上查查。 程序中的多态体现在CShapebase类的虚函数,在使用CShapebase指针调用这两个虚函数,实际调用的使子类的重载函数体。这里实际上是不知道函数怎样工作,但是知道函数功能。 例如:使用CShapebase指针调用DrawShape函数,因为不知道子类是什么图形,所以不知道DrawShape怎样画这个图,但是直到DrawShape函数会把这个图画好,这就达到了要求。 3、 Windows窗口绘图基本知识。 3.1 Windows GUI绘图基本知识。使用MFC类库之后,每个窗口都有一个CDC指针量。这个变量提供图形绘制。CDC类说明查查网络,内容比较多。CDC及提供图形绘制算法,也提供各种绘制模式(单色、异或色等),提供画笔和画刷的功能。 3.2 窗口绘图基本思想: 图形绘制在窗口中,windows不会帮助程序员让图形“长在”窗口上,当窗口被遮挡,最小化后,图形绘消失。程序需要在合适的时机把图形重新画在窗口上。所以窗口上画的内容需要程序员自己思考怎样保存。在本程序中所有图形保存在CPtList对象中。 3.2 Windows为窗口提供了一个重绘消息:OnPaint,在winxp系统中,这个消息会在窗口被遮挡部分从新出现、窗口从最小化恢复时调用。在win7种只有窗口从屏幕外移动进屏幕时调用。具体情况可以查查网络,这里是我的发现,并不是主要内容。 在OnPaint消息中重新绘制所有图形是一个保证图形不消失的好办法。 4、 Windows颜色控制基本知识。 4.1 windows使用RGB三原色(红绿蓝)提供颜色控制,本程序使用24位颜色,在内存中占用4字节,所以用int型表示,但是int型的最高位字节不使用,这样每一种颜色就有一个字节表示,每种颜色级别从0-255。系统提供RGB宏帮助定义颜色,例如:RGB(255,0,0)是红色,RGB(0,0,0)黑色,RGB(255,255,255)白色。 4.2 windows绘图提供多种颜色混合模式,本程序中使用异或模式实现图形的“橡皮筋”效果和移动效果,使用纯色模式定位图形。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧