【實現功能】當鼠標在視圖區移動時,在鼠標附近同步顯示鼠標所在的坐標位置。這個功能,對許多網友來說並不復雜。簡單的辦法是在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下編譯運行正確。如果大家有不同的見解和看法,歡迎討論。