在视图中同步显示鼠标的位置

2016-02-19 13:59 11 1 收藏

岁数大了,QQ也不闪了,微信也不响了,电话也不来了,但是图老师依旧坚持为大家推荐最精彩的内容,下面为大家精心准备的在视图中同步显示鼠标的位置,希望大家看完后能赶快学习起来。

【 tulaoshi.com - 编程语言 】

  当鼠标在视图区移动时,在鼠标附近同步显示鼠标所在的坐标位置。这个功能,对许多网友来说并不复杂。简单的办法是在OnDraw中绘制坐标位置就可以了。本文的实现思路是在不调用视图刷新以及不覆盖视图上原有内容的基础上实现鼠标坐标的跟踪显示。

 

  1。鼠标移动前,计算显示的鼠标坐标字符串所要占的矩形位置。

  2。将视图中这个位置的图像复制备份,

  3。在视图上绘制坐标

  4。鼠标下次移动时,在上次的位置上恢复保存的图像。

 

  若干常量定义:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

 #define WORD_HEIGHT 18    //数字的高度,根据系统的字体调整
#define WORD_WIDTH  7      //数字的宽度,根据系统的字体调整
#define OFF_X       15    //坐标显示的位置与鼠标的距离
#define OFF_Y       10   //一般在鼠标的右下角
#define TEXT_COLOR RGB(255,0,0)  //坐标文字的颜色

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

定义视图类的成员变量:


  CBitmap      m_StoreBmp;  //存储位图
 CDC          m_StoreDC;   //存储DC
 int          m_nCoordStrLen;   //坐标字符串长度
 CPoint   m_OldPt;  //上次的鼠标位置
 BOOL   m_bStart;   //鼠标是否开始移动

//拷贝重画位图,将视图中坐标字符串所要占的矩形位置的图像复制备份

//copyPt--鼠标当前的位置

void CDrawMouseView::CopyBitmap(CDC* pDC,CPoint copyPt)
{
 if(m_StoreBmp.GetSafeHandle()){//如果已有位图,则先清空
  m_StoreDC.DeleteDC();
  m_StoreBmp.DeleteObject();
  m_StoreBmp.m_hObject=0;
 }

 if(m_StoreDC.CreateCompatibleDC(pDC))
 {
  if(m_StoreBmp.CreateCompatibleBitmap(pDC,m_nCoordStrLen,WORD_HEIGHT))
  {
   m_StoreDC.SelectObject(&m_StoreBmp);
   m_StoreDC.BitBlt(0,0,m_nCoordStrLen,WORD_HEIGHT,pDC,copyPt.x+OFF_X,copyPt.y+OFF_Y,SRCCOPY);
  }
  else
  {
   if(m_StoreBmp.GetSafeHandle())
    m_StoreBmp.DeleteObject();
   m_StoreDC.DeleteDC();
  }
 }
}

//画坐标
 coordString---坐标字符串

drawPt--绘制起点坐标
void CDrawMouseView::DrawCoord(CDC* pDC,CString& coordString,CPoint drawPt)
{
 if(m_StoreBmp.GetSafeHandle())//有位图才画
 {
  drawPt.Offset(OFF_X,OFF_Y);
  CRect rect(drawPt,CSize(m_nCoordStrLen,WORD_HEIGHT));
  pDC-SetBkMode(TRANSPARENT);//设置透明背景
  COLORREF crf = pDC-SetTextColor(TEXT_COLOR);
  pDC-DrawText(coordString,rect,DT_CENTER);
  pDC-SetTextColor(crf);
 }
}

//擦除上次的坐标
void CDrawMouseView::DoRubberCoord(CDC* pDC,CPoint showPt)
{
 if(m_StoreBmp.GetSafeHandle())
 {
  m_StoreDC.SelectObject(&m_StoreBmp);
  pDC-BitBlt(showPt.x+OFF_X,showPt.y+OFF_Y,m_nCoordStrLen,WORD_HEIGHT,&m_StoreDC,0,0,SRCCOPY);
  m_StoreDC.DeleteDC();
  m_StoreBmp.DeleteObject();
 }
}
//鼠标移动事件
void CDrawMouseView::OnMouseMove(UINT nFlags, CPoint point)
{
 CDC* pDC = GetDC();
 if(!m_bStart)
  m_bStart = true;
 else
  DoRubberCoord(pDC,m_OldPt);//当不是第一次移动鼠标时才需要先擦除上次的坐标
 CString str;
 str.Format("[%d,%d]",point.x,point.y);
 m_nCoordStrLen=str.GetLength()*WORD_WIDTH;
 m_OldPt = point;
 CopyBitmap(pDC,point);
 DrawCoord(pDC,str,point);
 ReleaseDC(pDC);
}

本文所用程序在VC6.0下编译运行正确。如果大家有不同的见解和看法,欢迎讨论。

来源:https://www.tulaoshi.com/n/20160219/1605877.html

延伸阅读
无线鼠标有两个部件,一个是接收用的收发器,一个就是无线鼠标了,把收发器接上(一般是插usb接口),并且打开,装上电池打开鼠标的开关就可以找到鼠标,可以用了。 使用方法如下: 一:首先将买来的无线鼠标盒子打开,里面一般有两个部件,一个是鼠标,一个是接受器(相当于蓝牙)外型如下: 二:将接受器插入电脑USB接口,将电池放入鼠标内(注...
标签: 办公软件
    本章是学习Microsoft Excel 2000的一个起点。在Excel环境中,所有的工作均是围绕着工作簿文件和工作表展开的。在使用Excel系统前,我们必须理解这些基本概念,比如工作簿、工作表、单元格等等。     鼠标器是一个常用的输入工具,利用鼠标我们可以很方便地选取菜单、点击工具栏上的操...
插入视图的条件:    1.如果视图是基于一个基础表产生的,那么这就称为非连接视图,所有的非连接视图都是可以更新的,也就是说可以在该视图上进行,INSERT,UPDATE,DELETE的操作.   2.如果是连接视图,那就要遵守基本更新准则了.现在我只对INSERT准则做一下说明:在INSERT语句中不能显式或隐式的引用到任何非码保留基础表中的字段...
标签: 电脑入门
以下的VBA代码,可以控制鼠标的活动范围,即控制鼠标能操作的范围。哪里能操作,哪里不能操作,都能控制。 代码如下,附带诠释。 With ActiveSheet "With 语句,在一个单一对象上执行一系列的语句 .Unprotect "解除没设密码的工作表保护 .Cells.Locked = False "解除活动工作表中所有单元格的锁定 .Range("F1:J99").Locked = T...
为了能像在中文Visual FoxPro 6使用“表设计器”那样在中文Access 2000中设计表,需要通过“设计”视图来进行操作,其步骤如下所述。 步骤一、在“员工工时与工资”数据库窗口中单击“新建”按钮,如图12所示。然后在图13所示的“新建表”对话框的列表中选定“设计视图”项,并单击“确定”按钮。 图12 单击这个按钮 此...

经验教程

303

收藏

70
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部