当鼠标在视图区移动时,在鼠标附近同步显示鼠标所在的坐标位置。这个功能,对许多网友来说并不复杂。简单的办法是在OnDraw中绘制坐标位置就可以了。本文的实现思路是在不调用视图刷新以及不覆盖视图上原有内容的基础上实现鼠标坐标的跟踪显示。
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)1。鼠标移动前,计算显示的鼠标坐标字符串所要占的矩形位置。
2。将视图中这个位置的图像复制备份,
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)3。在视图上绘制坐标
4。鼠标下次移动时,在上次的位置上恢复保存的图像。
(本文来源于图老师网站,更多请访问http://m.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) ////坐标文字的颜色
定义视图类的成员变量:
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下编译运行正确。如果大家有不同的见解和看法,欢迎讨论。