我在客户区 需要总是在上边和左边 以及左下角显示 标尺和坐标! 但是在滚动的时候,他们也跟着滚动;
使用了如下代码:
     long  m_nVScrollPos ;
    long  m_nHScrollPos ;
void CMyView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
int nDelta  ;
switch(nSBCode)
{
case  SB_LINELEFT:
  nDelta = -LINESIZE ;
  break ;
case  SB_PAGELEFT:
  nDelta = - m_nHPageSize ;
  break ;
case  SB_THUMBTRACK:
  nDelta = (long)nPos - m_nHScrollPos ;
  break ;
case  SB_LINERIGHT:
  nDelta = LINESIZE ;
  break ;
case SB_PAGERIGHT:
  nDelta = m_nHPageSize ;
  break ;
default:
return ;
}
long nScrollPos = m_nHScrollPos + nDelta ;
long nMaxPos    = CXMAXSIZE - m_nHPageSize ;
    if(nScrollPos < - CXMAXSIZE )
nDelta = - m_nHScrollPos ;
else if(nScrollPos > nMaxPos )
nDelta = nMaxPos - m_nHScrollPos ;
if(nDelta != 0)
{
   m_nHScrollPos += nDelta ;
   SetScrollPos(SB_HORZ,m_nHScrollPos) ;
   ScrollWindow(-nDelta,0) ;
   Invalidate() ;
} CView::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CMyView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
long nDelta ;
switch(nSBCode)
{
case SB_LINEUP:
 nDelta = - LINESIZE ;
 break ;
case SB_PAGEUP:
 nDelta = - m_nVPageSize ;
 break ;
case SB_THUMBTRACK:
 nDelta = (long) nPos - m_nVScrollPos ;
 break ;
case SB_LINEDOWN:
 nDelta = LINESIZE ;
 break ;
case SB_PAGEDOWN:
     nDelta =  m_nVPageSize ;
 break ;
default:
return ;
}
long nScrollPos = m_nVScrollPos + nDelta ;   
long nMaxPos  = CYMAXSIZE - m_nVPageSize ;       
if(nScrollPos <-CYMAXSIZE)                       
nDelta = - m_nVScrollPos ;            
else if(nScrollPos > nMaxPos)             
nDelta = nMaxPos - m_nVScrollPos ;      if(nDelta != 0)        
 {
 m_nVScrollPos += nDelta ;               
 SetScrollPos(SB_VERT,m_nVScrollPos) ;  
 ScrollWindow(0,-nDelta) ;               
 Invalidate() ;
 } CView::OnVScroll(nSBCode, nPos, pScrollBar);
}
然后在 OnDraw函数中调用:
CRect rc ;
GetClientRect(&rc) ;
        pDC->SetMapMode(MM_LOMETRIC) ;
        pDC->DPtoLP(&rc) ;
CPoint Pt ;
Pt.x = m_nHScrollPos;
Pt.y = - m_nVScrollPos+ rc.Height();
        pDC->SetWindowOrg(Pt) ;