MFC鼠标响应、鼠标画线

2023-05-16

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


}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFC鼠标响应、鼠标画线 的相关文章

  • 安装VS2008后,在winnt.h中出现编译错误

    我正在尝试将我们的项目从 VS2005 转移到 VS2008 并且在 MFC 项目上遇到此构建错误 C Program Files Microsoft SDKs Windows v6 0A include winnt h 236 error
  • 如果我没有为其相应的命令声明消息映射条目,如何阻止 MFC 禁用我的控件?

    我有以下问题 如果我没有相应消息的消息映射条目 假设 ID MYBUTTON1 MFC 将禁用我的工具栏 CToolbar 控件 有没有解决的办法 我对菜单也有同样的问题 但我发现您可以通过将 CFrameWnd m bAutoMenuEn
  • MFC> 将对话框连接到对话框类

    我在现有的资源文件中定义了一个新对话框及其控件 我还创建了一个新文件 它将处理从此对话框生成的事件 但我不确定如何连接这两者 是声明enum IDD IDD NEW DIALOG 连接两者所需的一切 或者我们应该添加一些其他声明 在 MFC
  • VC++中如何判断链接是否存在?

    我有一个链接 我已通过正则表达式检查该链接是否是有效的 URL 现在 我想检查该链接是否是有效的 http 链接 即它不应该是不存在的链接 VC 6 0 MFC 有办法检查吗 一种选择是尝试使用以下方法从该 URL 获取数据URLOpenB
  • dll 中的 MFC LoadString 失败

    我在 dll 中有一个静态函数 它使用 LoadString 从资源加载字符串 当我从该 dll 调用此函数时 一切正常 但是 当我从其他模块 activeX 控件 调用此函数时 LoadString 失败并出现错误 ERROR RESOU
  • 菜单被裁剪

    我有一个MFC项目 它支持 40 多种语言 我的电脑上有两个显示器 它们都是不同尺寸的显示器和不同的分辨率 如果我将应用程序移至较小的显示器上 则不会显示完整的语言菜单 我知道它会显示滚动条 为什么不是呢 我的菜单是标准菜单 没有什么花哨
  • DirectUI 的真相是什么? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个 Windows 桌面应用程序 它需要一个很棒的 UI 我现在使用Visual Studio和MFC 后来听说DirectU
  • 升级后的 MFC 应用程序看起来仍然很旧

    我有一个用 VC6 编写的 MFC 应用程序 我已将其升级到 VS2015 并且它可以构建并运行 该应用程序是一个主可执行文件 其中包含许多包含对话框的 DLL 然而应用仍然looks就像用 VC6 构建的一样 所有 GUI 组件都没有 W
  • 如何最好地避免 C++/CLI 本机类型中的双重转换

    传统上 我一直使用 MFC 扩展 dll 并使用 dllimport dllexport 导入 导出 但是 当 dll 更改为使用 clr 时 此方法的成本会变得很高 因为调用可能会导致双重转换 我现在的性能受到了巨大的打击 需要停止双重重
  • 将简单的 MFC CView/CDocument/CSingleDocTemplate 应用程序转换为 ActiveX 控件

    我有一个相当简单的 MFC 应用程序 它只定义了自己的子类CDocument CView and CFrameWnd并通过使用它们CSingleDocTemplate在视图的树中显示文档的只读内容 都是非常标准的MFC MVC 我现在需要转
  • AfxGetAppName() 返回垃圾字符

    我的应用程序中有以下代码行 CString strAppName AfxGetAppName 有时会充满strAppName出现了垃圾字符 我不明白为什么 有人有主意吗 TIA 如果你改变的话这是可能的m pszAppName手动 在应用程
  • 与 UltraHD 兼容的 CHtmlView

    CHtmlView与 UltraHD 分辨率不兼容 实现 UltraHD 感知并不仅仅在于使用正确的 HTML CSS 打印预览机制失败并裁剪页面 许多个月前 微软承认这是一个问题 但没有解决它 我的应用程序大量使用CHtmlView用于显
  • 编辑默认工具栏时 Microsoft Visual Studio“未知位图格式”

    我已使用项目创建向导使用 Microsoft 基础类库 MFC 创建了一个应用程序 我创建了一个多文档界面 MDI 应用程序 该向导创建您可以使用的虚拟工具栏和菜单 我扩展了默认工具栏 没有任何问题 但是现在当我尝试通过资源视图编辑它时 我
  • 基于 C# .NET 文档的应用程序操作图

    我想开发一个新的应用程序 用户可以在其中创建描述流程的图表 我认为在这种情况下 基于文档的应用程序是我唯一的选择 我熟悉C net C MFC 和J2EE 根据您的经验 实现这一目标的最佳方法是什么 我应该关注哪个平台 图表必须由方框和箭头
  • 禁用/启用 MFC 功能包的功能区按钮

    我正在使用 MFC 功能包 并且功能区栏上有一些按钮 即 CMFCRibbonButton 的实例 问题是我想在某些条件下启用和禁用其中一些 但在运行时 我怎样才能做到这一点 因为没有具体的方法 我听说解决方案是在运行时附加 分离事件处理程
  • 如何在 MFC 中创建带圆角的进度控件?

    我需要在 MFC 应用程序中创建一个带圆角的进度条 我尝试过使用 CreateRoundRectRgn 和 SetWindowRgn 的组合 它具有使控件完全消失的效果 我还尝试使用透明的 GIF 覆盖层 该覆盖层将绘制在进度栏的顶部 但我
  • 从模态 MFC 表单获取输入信息

    我已经创建了表格CPreparationDlg具有Edit Control 然后我创建了创建模态表单的应用程序 在按 确定 后 我需要将编辑控件中输入的文本读入主程序的变量中 最好的方法是什么 class CPreparationApp p
  • MFC编辑控件更新

    我尝试使用它添加的变量来更新编辑控件的文本 这是一个CString但我失败了 m sNrAuto some text UpdateData TRUE 我也尝试过使用UpdateWindow 但编辑控件仍为空白 我知道我可以使用SetWind
  • 如何在MFC中对CListCtrl中的Item进行排序?

    我在 MFC 中制作了一个基于对话框的应用程序 我将 CListCtrl 控件放在对话框上 并将其视图样式设置为报告类型 我在此列表视图中有五列 所有列都是字符串类型 我想在此列表中实现排序 也就是说 当我单击某一列时 它应该对列表中的项目
  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft

随机推荐

  • BetaFlight模块设计之三十四:OSD模块分析

    BetaFlight模块设计之三十四 xff1a OSD模块分析 1 OSD模块1 1 osd状态机子模块1 2 osd warnings检查子模块1 3 osd elements子模块 2 OSD设备 驱动及适配框架2 1 OSD设备2
  • ssh无法远程登陆问题汇总

    ssh无法远程登陆问题汇总 1 ssh服务是否已经启动1 1 sshd服务是否已经安装1 2 sshd是否已经启动 2 检查sshd配置3 检查路由情况4 检查hosts许可文件5 检查防火墙问题5 1 检查防火墙是否启动5 2 修改防火墙
  • traceroute命令结果分析

    traceroute命令结果分析 1 基本原理2 IP地址种类2 1 A类IP地址2 2 B类IP地址2 3 C类IP地址2 4 D类地址用于多点广播 Multicast 2 5 E类IP地址 3 测试3 1 第一次3 2 第二次 4 总结
  • bash脚本返回值应用

    bash脚本返回值应用 应该说bash脚本对于linux系统来说具有举足轻重的意义 这里不做展开 xff0c 也不做bash脚本介绍 更多的是做一个例子 xff0c 应用了bash脚本的以下特性 xff1a 输入参数函数定义调用可执行命令脚
  • 如何理解printf变参函数的实现

    如何理解printf变参函数的实现 1 printf函数变参的问题2 printf函数定义和解释2 1 printf函数定义2 2 Linux Man page解释 https man7 org linux man pages man3 s
  • BetaFlight模块设计之三十五:RSSI信号强度&链路稳定性分析

    BetaFlight模块设计之三十五 xff1a RSSI信号强度 amp 链路稳定性分析 1 RSSI信号强度1 1 RSSI Value1 2 RSSI dBm Value 2 链路稳定性3 RSSI amp LinkQuality来源
  • Linux的so组件设计框架及逻辑

    Linux的so组件设计框架及逻辑 1 组件关注点1 1 组件定义关注点1 2 组件业务关注点 2 so特性3 so组件设计逻辑4 so组件设计框架4 1 so组件范例4 2 so隐式调用范例4 3 so显式调用范例 5 so组件设计建议
  • PX4模块设计之八:Ubuntu 20.04搭建FlightGear模拟器

    PX4模块设计之八 xff1a Ubuntu 20 04搭建FlightGear模拟器 1 使用FlightGear的源由2 FlightGear模拟器简介3 Ubuntu 20 04搭建FlightGear步骤3 1 设置flightge
  • 封装CopyFileEx函数,实现文件复制中的暂停,控速,获取进度

    封装CopyFileEx函数 xff0c 实现文件复制中的暂停 xff0c 控速 xff0c 获取进度等 前段时间无意间想到如何控制文件复制过程的复制速度 xff0c 并且能实时获得复制进度 对于一个几兆甚至更小的文件 xff0c 调用AP
  • PX4模块设计之九:PX4飞行模式简介

    PX4模块设计之九 xff1a PX4飞行模式简介 关于模式的探讨1 需求角度1 1 多旋翼 MC multi copter 1 1 1 RC控制模式1 1 1 1 Position Mode1 1 1 2 Altitude Mode1 1
  • PX4模块设计之十:PX4启动过程

    PX4模块设计之十 xff1a PX4启动过程 1 硬件 飞控硬件上电2 硬件 飞控硬件初始化3 硬件 43 软件 飞控bootloader初始化4 硬件 43 软件 飞控系统初始化5 软件 飞控应用初始化6 配置 SD卡配置文件6 1 e
  • PX4模块设计之十一:Built-In框架

    PX4模块设计之十一 xff1a Built In框架 1 Nuttx Built In框架2 PX4 Built In框架2 1 NSH Built In关联文件2 2 NSH Built In关联文件生成2 3 NSH Built In
  • PX4模块设计之十二:High Resolution Timer设计

    PX4模块设计之十二 xff1a High Resolution Timer设计 1 HRT模块特性2 HRT模块基本功能2 1 循环触发接口2 2 延迟触发接口2 3 定时触发接口2 4 其他功能 3 HRT模块精度3 1 精度粒度3 2
  • PX4模块设计之十三:WorkQueue设计

    PX4模块设计之十三 xff1a WorkQueue设计 1 WorkQueue启动2 WorkQueue接口2 1 基本接口2 2 辅助接口2 3 WorkQueue任务函数2 3 1 Flat Build2 3 2 Protected
  • PX4模块设计之十四:Event设计

    PX4模块设计之十四 xff1a Event设计 1 Event主要接口1 1 字符串消息接口1 2 参数消息接口1 3 内部uORB实现 2 PX4 Events框架2 1 配置文件2 2 内嵌代码 3 使用方法3 1 Step 1 xf
  • PX4模块设计之十五:PX4 Log设计

    PX4模块设计之十五 xff1a PX4 Log设计 1 PX4 Log介绍2 ULog文件格式2 1 ULog文件结构2 2 ULog文件头结构2 3 ULog消息结构定义2 3 1 B Flag Bits 消息2 3 2 F Forma
  • PX4模块设计之十六:Hardfault模块

    PX4模块设计之十六 xff1a Hardfault模块 1 Hardfault模块初始化2 Hardfault模块主程序3 Hardfault命令3 1 hardfault check status3 2 hardfault rearm3
  • PX4模块设计之十七:ModuleBase模块

    PX4模块设计之十七 xff1a ModuleBase模块 1 ModuleBase模块介绍2 ModuleBase类介绍3 ModuleBase类功能介绍3 1 模块入口3 2 模块启动3 3 模块停止3 4 状态查询3 5 任务回调3
  • PX4模块设计之十八:Logger模块

    PX4模块设计之十八 xff1a Logger模块 1 Logger模块简介2 模块入口函数2 1 主入口logger main2 2 自定义子命令Logger custom command2 3 日志主题uORB注册 3 重要实现函数3
  • MFC鼠标响应、鼠标画线

    鼠标响应关键就是对两个函数进行操作 xff1a OnLButtonDown和OnLButtonUp xff1b 1 使用MFC AppWizard exe xff09 建立一个单文档MFC工程 2 首先要在CxxxView类的定义里加上后续