`
helpbs
  • 浏览: 1166297 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

【实现方法】

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

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

3。在视图上绘制坐标

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

【实现代码】

若干常量定义:

#define WORD_HEIGHT 18 //数字的高度,根据系统的字体调整
#define WORD_WIDTH 7 //数字的宽度,根据系统的字体调整
#define OFF_X 15 //坐标显示的位置与鼠标的距离
#define OFF_Y 10 //一般在鼠标的右下角
#define TEXT_COLORRGB(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下编译运行正确。如果大家有不同的见解和看法,欢迎讨论。

分享到:
评论

相关推荐

    编写一个程序:要求各个视图能够同步更新

    编写一个程序: 1、 程序主窗口,宽700,高600; 2、 可拆分的窗口; 3、 单击鼠标右键可出现一个随机大小的矩形; 4、 要求各个视图能够同步更新,可以不使用无效区进行更新。

    VC 界面编程类编程技巧资料WORD版[96文档].rar

     在视图中同步显示鼠标的位置.doc  用MFC对话框做无闪烁图片重绘.doc  VC 中MFC窗口对象的清除.doc  在VC中透明浮动按键的实现.doc  制作 MSN、QQ 的消息提示窗口.doc  一个功能强大的MFC界面处理扩展库...

    Qt5开发及实例-CH2106.rar,Qt5用多种导航视图组合代码

    无论采取哪种方式,三个区域的视图都会同步变化。 实现步骤如下。 (1)新建Qt Quick Controls应用程序,项目名称为“View”。 (2)在项目工程目录中建一个images文件夹,其中放入三张图片作为本项目的资源,如图...

    Visual C++编程技巧精选集 光盘

    159.如何在状态栏窗格中显示鼠标位置 160.如何在状态栏窗格中滚动显示文本 161.如何在状态栏窗格中加载进度条 162.如何在状态栏窗格中加载图像 163.如何在状态栏窗格中播放视频动画 第5章 光标和图标的应用 164....

    Windows应用程序界面的设计

    编写一个程序: 1、程序主窗口,宽700,高600; 2、可拆分的窗口; 3、单击鼠标右键会出现一个随机矩形; 4、要求各个视图能够同步更新。...并且在单击鼠标右键时会出现一个随机的矩形,而且能使各个视图同步更新。

    傲游浏览器3(Maxthon) 3.1.8.1000 正式版

    使用鼠标右键菜单中的复制在网页上复制文字的时候, 粘贴到记事本中会丢失换行符. 收藏 从收藏栏一次性打开某文件夹下所有收藏项目时,标签的顺序与收藏的顺序相反. 傲游浏览器3.1.3 正式版 [阅读模式] 可以使用...

    计算机应用基础练习题带参考答案.doc

    19中,在大纲视图模式下可以实现在其他视图中可实现的一切编辑功能。 20.在中,用"文本框"工具在幻灯片中添加文字时,文本框的大小和位置是确定的。 21网络是计算机和通信两大技术相结合的产物。 22语言代码程序...

    Visual C++编程技巧精选500例.pdf

    098 如何在状态栏上显示鼠标当前位置? 099 如何使用代码获取状态栏指针? 第6章 图标与光标 100 如何设置光标? 101 如何裁剪光标? 102 如何捕捉光标热区? 103 如何创建一个等待光标? 104 如何结束一个等待光标? 105 ...

    Visual C++开发经验技巧宝典(第9章)

    0564 如何在程序中显示文件属性对话框 377 9.6 桌面相关 377 0565 隐藏和显示桌面文件 377 0566 隐藏和显示开始按钮 378 0567 隐藏和显示Windows任务栏 378 0568 判断屏幕保护程序是否在运行 379 0569 ...

    Visual C++开发经验技巧宝典(第9章)—1

    0564 如何在程序中显示文件属性对话框 377 9.6 桌面相关 377 0565 隐藏和显示桌面文件 377 0566 隐藏和显示开始按钮 378 0567 隐藏和显示Windows任务栏 378 0568 判断屏幕保护程序是否在运行 379 0569 ...

    Delphi7编程100例

    在下拉列表框中显示树形视图 自定义系统的About项 修改系统级菜单 实现透明窗体效果 爆破特技窗体 只允许建立一次子窗体的MDI程序 从外部DLL中调用子窗口 新颖的资源管理器界面 如何生成半圆形窗口...

    Delphi编程100例

    在下拉列表框中显示树形视图 自定义系统的About项 修改系统级菜单 实现透明窗体效果 爆破特技窗体 只允许建立一次子窗体的MDI程序 从外部DLL中调用子窗口 新颖的资源管理器界面 如何生成半圆形窗口 制作字幕滚动窗体...

    Fritzing_V0.9.3

    其中,对于前3种视图(面包板、原理图和PCB)而言,无论你在其中的哪一种进行电路设计,软件都会自动化同步其他两种视图,还可以生成制版厂生产所需要的Greber文件、PDF图片和CAD格式文件。这一切都极大地推广和普及...

    易利项目管理软件2013免费体验版(双代号网络图)

    10.20 日历在显示为工程标尺时不应该绘制日历的纵向刻度线 多谢【㊣夝凨乀網】提供了具体的案例并发现了原因 10.19 修订部分项目在保存后重新打开项目开始时间会变化的问题 多谢【老人头】提供了具体的案例并发现了...

    True DBGrid for .NET-基于.NET的企业版网格控件

    此外,您具有对滚动行为的控制:选择具有在每个分割中独立工作的滚动条(对于需要从不同列的数据中对比字段值时非常有效)或选择一个滚动条同步滚动复合分割。 2D和3D单元显示选择两维,三维和两者结合来控制单元...

    超实用的jQuery代码段

    10.2 在移动设备页面中创建多个显示视图 10.3 创建对话框显示效果 10.4 从外部文件中加载页面内容 10.5 为页面添加转场效果 10.6 设置全局默认的转场效果 10.7 定制显示回退按钮 10.8 在标题栏中添加导航栏 10.9 在...

    《Delphi7编程100例》代码

    ToolBar工具栏控件的使用动态建立主菜单选项窗口界面的动态分隔条动态设置选项卡页面在标题栏中自定义按钮窗体开合窗帘效果Windows XP界面效果实现OutLook滚动工具栏效果在下拉列表框中显示树形视图自定义系统的...

    Syncs - synchronized web presentations-crx插件

    通过同步,您可以通过在笔记本计算机显示屏上运行第二个同步幻灯片放映,轻松地将注释添加到任何演示文稿中。 需要下一张幻灯片预览吗? 在第二个视图中开始相同的演示文稿,向前滑动并同步两个视图。 在每个导航...

Global site tag (gtag.js) - Google Analytics