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

2016-02-19 13:56 20 1 收藏

下面这个视图中同步显示鼠标的位置教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!

【 tulaoshi.com - 编程语言 】

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

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

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

3。在视图上绘制坐标

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

若干常量定义:

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

定义视图类的成员变量:

 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();
  }
 }
}

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

  ////画坐标

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下编译运行正确。如果大家有不同的见解和看法,欢迎讨论。

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

来源:http://www.tulaoshi.com/n/20160219/1605714.html

延伸阅读
标签: 电脑入门
以下的VBA代码,可以控制鼠标的活动范围,即控制鼠标能操作的范围。哪里能操作,哪里不能操作,都能控制。 代码如下,附带诠释。 With ActiveSheet "With 语句,在一个单一对象上执行一系列的语句 .Unprotect "解除没设密码的工作表保护 .Cells.Locked = False "解除活动工作表中所有单元格的锁定 .Range("F1:J99").Locked = T...
标签: Web开发
用惯了Windows的人对各种各样的鼠标样式一定不会陌生。当鼠标移动到不同的地方时,当鼠标执行不同的功能时,当系统处于不同的状态时,都会使鼠标的形状发生变化。而在网页上往往只有当鼠标在超级链接上时才出现一个手形,在其它地方似乎没有什么变化。这同充满动感的网页显得不怎么和谐。实际上,用CSS可以方便地定义许多种鼠标形状。用本文介...
标签: flash教程
本例由 中国 sanbos 编译,转载请保留此信息! 效果演示: [next] 在本文中我将向你展示怎样用AS代码创建鼠标的x和y坐标位置。 第1步:创建一个新的flash文档,按Ctrl+j键(文档属性),设置你喜欢的文档的高度和宽度。选择任何颜色作为背景颜色。设置您的Flash影片的帧速率为24,然后单击确定。 第2步:选用文本工具(A)在舞台上输入...
标签: flash教程
下载Fla源文件(Flash5) 我们现在在很多国外的网站上和movie里常常可以看见鼠标由其它的图形代替的效果,现在我们就分析一下它是如何实现的,其实是很简单的,利用Flash5的强大的对于对象的控制,三下五除二就可轻松搞定^_^。 这里我做了个简单的例子,我们就照着这个源代码来学习吧!大家也可以把这个当作对flash5熟悉的一个练习:...
标签: 电脑入门
在Word的程序窗口中不同位置上双击,可以快速实现一些常用功能,我们归纳如下: 在标题栏或垂直滚动条下端空白区域双击,则窗口在最大化和原来状态之间切换; 将鼠标在标题栏最左边WORD文档标记符号处双击,则直接退出WORD(如果没有保存,会弹出提示保存对话框); 将鼠标移到垂直滚动条的上端成双向拖拉箭头时双击,则快速将文档窗口一分为二...

经验教程

351

收藏

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