dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>C/C++>C/C++技术资料>文章内容
在视图中同步显示鼠标的位置
来源:CSDN     作者:    
【实现功能】当鼠标在视图区移动时,在鼠标附近同步显示鼠标所在的坐标位置。这个功能,对许多网友来说并不复杂。简单的办法是在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();
 }
}
}

//画坐标

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

 

 

上一篇:在VC中透明浮动按键的实现   下一篇:无闪烁刷屏技术的实现
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·C语言数组排序小结
·Python 与 C++ 程序的简单实例对
·c++ 数组与指针
·C++中的内存管理(new、delete、
·如何用C语言开发DSP嵌入式系统
·如何用C语言开发DSP嵌入式系统
·Linux下C语言编程
·学习arm的话先看哪本书?
·C++初学者应该关心的优秀图书一
·利用C语言小程序来解决大问题
·用C语言写PHP扩展的步骤
·用C语言扩展PHP功能
  相关文章
·在VC中透明浮动按键的实现
·无闪烁刷屏技术的实现
·VC++学习:用SDK实现分隔条
·利用VC编程在界面上实现3D文字
·一个对Winsock完成端口模型封装
·重载函数的应用与深入剖析
·Gzip Zlib PNG 压缩算法,源码详
·窗口类的诞生(注册自己的窗口类)
·窗口类的诞生(注册自己的窗口类)
·让你的控制台程序也支持自动补齐
·显示内存中的HTML内容
·ado方式访问带密码数据库的方法
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763