鼠标响应关键就是对两个函数进行操作: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表示鼠标坐标。(相对于当前窗口而言的坐标)

}

MFC鼠标响应、鼠标画线相关推荐

  1. MFC初学笔记之画线画笔画刷

    学习了WINdows程序的框架之后本来是要弄opengl的,后来想想还要在opengl上面添加按钮label什么的与用户交换,后来有考虑学了QT,感觉封装的太....又在学MFC,个人感觉用MFC 比 ...

  2. 在flash课件中用鼠标任意画线

    createEmptyMovieClip("xian",1); //创建一个空的mc,名为xian with (xian) {     _root.onMouseMove = fu ...

  3. 【MFC】实现简单画板功能,包含画点、画线、矩形、棋盘,指定棋盘大小等功能。

    [MFC]实现简单画线.矩形.棋盘功能. 一.实现基础绘画功能 (一)新建工程 (二)实现画点功能 (三)实现画直线功能 (四)实现画矩形功能 (五)实现画棋盘功能 二.基础交互式示例 (一).交互式 ...

  4. VC/MFC动态画线(橡皮线),画圆,画椭圆,画矩形

    2012年12月7日 22:42:14 今天我在csdn网站上通过学习别人的博客学习到了动态画矩形,画线的方法,这使得我对Windows的消息循环机制有了更深刻的理解.首先来总结一下我今天的收获,呵呵 ...

  5. 同花顺如何切换k线_如何在同花顺K线上自由画线

    如果是专业版用户,可以使用软件提供的画线功能.画线功能是通过图形分析图中的画线工具栏来实现的,画线工具栏包括光标.画射线.画直线.画平行线.画平行带.-画黄金分割线.画甘氏线.删除选中图形和删除全部图 ...

  6. MFC限制鼠标区域、画橡皮条线、任务栏显示图标、核对标记、文档背景色(二)

    涛涛在学习程序设计,欢迎各位程序设计爱好者和我一起学习 限制鼠标活动区域 可以写在view类的OnMouseMove中添加如下代码 if (nFlags&&MK_LBUTTON) { ...

  7. High-speed Charting Control(MFC绘图控件)--MFC绘图Demo(包含鼠标响应)

    首先我们先上效果图,如果你需要这样的Demo请点击此处下载:High-speed Charting Control--MFC绘图Demo 在开始之前,我们首先推荐一篇博客,该博客主要对该控件的英文开发 ...

  8. 计算机图形学(六)——MFC实现鼠标橡皮筋技术画圆

    鼠标橡皮筋技术画圆就是采用圆心和圆周上任一点画圆技术(简称C+P方法),首先用鼠标左击选择圆心位置,然后移动鼠标,圆随鼠标移动而扩大或缩小,当再次单击鼠标左键时,确定圆周上的一点,从而画出相应的圆.直 ...

  9. VC++简单实现工具软件随鼠标移动画线的功能

    一些绘图或仿真软件都有这功能,随鼠标移动,始终有一条线从起点跟随到鼠标当前位置:这功能不只是随鼠标移动画线:实际要实现2个功能:擦除前一条线,再画一条从起点到当前鼠标位置的线: 环境Win10,VC6 ...

  10. 《MFC游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9327377 作者:七十一雾央 新浪微博:http:// ...

最新文章

  1. sql 忽略大小写_Flink使用Calcite解析Sql做维表关联(一)
  2. c++ 获取当前时间_【Python】日期和时间
  3. 《研磨设计模式》chap7 抽象工厂 Abstract Factory
  4. 查看虚拟机cpu型号_虚拟机管理器(Virtual Machine Manager)简介 | Linux 中国
  5. pat 乙级 1020 月饼(C++实现)
  6. java 快速构建ssm项目_SSM快速搭建
  7. WORD Application.Documents.Open函数返回null的一种解决方法
  8. 网络请求的null值处理
  9. 【ACL 2021】基于一致性正则的跨语言微调方法
  10. SliderBar4.0常用滑块滚动效果封装
  11. 三菱GXWorks2 绘制梯形图
  12. 谷歌地图,计算两个坐标点之间的距离
  13. matlab的RI是什么,LTE上报的CQI、PMI、RI分别有什么用
  14. Apollo星火计划学习笔记——参考线平滑算法解析及实现(以U型弯道场景仿真调试为例)
  15. 使用python读取和分析fasta文件
  16. Linux:《gzip》《bzip2》压缩解压
  17. 网站广告怎样做效果最好?
  18. 工作中常用的Linux命令(持续更新)
  19. 服务器开机提示系统初始化失败,Win7开机提示交互式登录进程初始化失败怎么解决...
  20. 如何使用身份证实名认证API接口?

热门文章

  1. 图文实例带你了解香农编码和霍夫曼编码
  2. iSCSI服务部署网络存储
  3. excel 瀵煎叆mysql_hypermesh瀵煎叆ansys
  4. 搭建MQTT服务器实现Android客户端与ESP8266之间即时通信
  5. 某游戏浏览器Flash加速dll调用,打造我们自己的Flash加速器
  6. couchbase java view_couchbase 相关
  7. 求小于100的所有合数 python_python100例
  8. 谈谈教学视频加密、防录屏的方法
  9. 最全名企笔试题+算法题
  10. h5扫描pc端二维码登录