我在客户区 需要总是在上边和左边 以及左下角显示 标尺和坐标! 但是在滚动的时候,他们也跟着滚动;
使用了如下代码:
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) ;
使用了如下代码:
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) ;
解决方案 »
- mfc怎样自动隐藏应用程序的窗口?
- 在picture control 里贴图的问题
- 帮忙翻译下摘要的一段文字,关于图像检索的
- 如何在MDI的主窗上显示图片且可以随着窗体的缩放而缩放。
- 为什么系统老是发送WM_PAINT消息呢?
- 如果是用CSocket类的话是不是就不用另外建一个线程来接收数据了?????????
- dll无法向不是活动窗口的程序发消息?
- 一个关于宏定义的问题
- 请教,谁知道图像剪切的代码,高分相送,只要可行,一定兑现!!!
- CSocket与线程的简单问题。
- 求助,大家都知道 CStatic 控件创建有两步,第一步,new 一个CStatic ,第二步 用Create 函数连接对象,那么假设我做过一遍,当我第二次用CStatic时,怎么判断这个对象已经被连接Create出来的对象
- 关于VC6.0换为VC2005遗留的问题
拜托!!!!!!!!!!!!!!!!!!!!!!!!!!