找回密码
 注册会员
查看: 814|回复: 0

mfc滚动条的相关问题

[复制链接]
发表于 2010-7-20 09:38:06 | 显示全部楼层 |阅读模式
<p>mfc滚动条的相关问题</p>
<p><img src="http://img.baidu.com/img/iknow/icn_point.gif"> 悬赏分:20 -</p>
<p>解决时间:2010-7-20 09:35</p>
<p>我现在需要做一个应用软件,需要输入大量的信息,在对话框的左侧是输入区,右边是预览区。</p>
<p>由于要输入大量的信息,需要大量的 Edit 控件 。这样左侧的有限的空间是远远不够的。</p>
<p>哪位高手可以实现类似“滑动条”那样的东西,能够使 这些控件都存在于当前对话框中,然后用“滑动条”来拖动。</p>
<p>如解决必有高分相赠,谢谢</p>
<p>提问者: 迷惘地活着 - 六级</p>
<p>最佳答案</p>
<p>首先你要有一个主Wnd  CExtendMainWnd ,里面放一个子Wnd  CExtendWnd m_wndExtend和一个CScrollBar  m_vScrollBar,Cedit都放在子Wnd中,子Wnd跟主Wnd的高度和Y坐标都是相同的,宽度留一个地方放ScrollBar.拖动滚动条的时候,把子Wnd MoveWindow到相应的位置。你的CEdit每个都有高度的,可以根据N个CEdit高度和与ParentWnd.GetClientRect 的高度进行比较,如果和超过了客户端的高度,</p>
<p>CScrollBar.ShowWindow(SW_SHOW)(之前先把CScrollBar 创建好后 Hide).</p>
<p>后面再来响应ON_WM_VSCROLL()</p>
<p>主要的代码:</p>
<p>void CExtendMainWnd::CreateWnd(CWnd* pParent,int iColorLevel,CRect& rect,int iDefItemHeight )</p>
<p>{</p>
<p>CWnd::Create(NULL,NULL,WS_CHILD&#73;WS_VISIBLE,rect,pParent,1001);</p>
<p>m_wndExtend.CreateWnd(this,m_iColorlevel,rect,iDefItemHeight);</p>
<p>m_vScrollBar.Create(WS_CHILD&#73;SB_VERT,CRect(0,0,0,0),this,1002);</p>
<p>}</p>
<p>每次添加完一个CEdit</p>
<p>void CExtendWnd::AddItemWnd(CBaseItemWnd* pBaseItemWnd)</p>
<p>{</p>
<p>//我这里是动态添加的</p>
<p>ExtendItem* pExtendItem = new ExtendItem;</p>
<p>pExtendItem->m_pBaseWnd = pBaseItemWnd;</p>
<p>pExtendItem->m_pBaseWnd->CreateWnd(CRect(0,0,0,0),m_iColorLevel,this,m_uIDWnd );</p>
<p>m_uIDWnd ++;//</p>
<p>Arrange();</p>
<p>GetParent()->SendMessage(WM_WHETHERNEEDSCROLL,0,0);//加完给父窗口发消息去知道需不需要加滚动条</p>
<p>}</p>
<p>消息处理</p>
<p>LRESULT CExtendMainWnd::OnWhetherNeedScroll(WPARAM wParam,LPARAM lParam)</p>
<p>{</p>
<p>UpdataScrollBar();</p>
<p>Arrange();</p>
<p>return 0;</p>
<p>}</p>
<p>就UpdataScrollBar();</p>
<p>void CExtendMainWnd::UpdataScrollBar()</p>
<p>{</p>
<p>CRect rtParent;</p>
<p>GetWindowRect(&rtParent);</p>
<p>CRect rtWindow;</p>
<p>m_wndExtend.GetWindowRect(&rtWindow);</p>
<p>if ( m_wndExtend.GetDisplayHeight() > rtParent.Height()  )</p>
<p>{</p>
<p>SCROLLINFO info;</p>
<p>info.cbSize = sizeof(SCROLLINFO);</p>
<p>info.fMask = SIF_ALL;</p>
<p>info.nMin = 0;</p>
<p>info.nMax = m_wndExtend.GetDisplayHeight();</p>
<p>info.nPage = rtParent.Height();</p>
<p>info.nPos = m_iScrollBarPos;</p>
<p>m_vScrollBar.SetScrollInfo(&info);</p>
<p>m_vScrollBar.ShowWindow(SW_SHOW);</p>
<p>m_bNeedScrollBar = TRUE;</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>m_vScrollBar.ShowWindow(SW_HIDE);</p>
<p>m_bNeedScrollBar = FALSE;</p>
<p>}</p>
<p>}</p>
<p>拖动滚动条的消息响应</p>
<p>void CExtendMainWnd::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)</p>
<p>{</p>
<p>// TODO: Add your message handler code here and/or call default</p>
<p>SCROLLINFO si;</p>
<p>m_vScrollBar.GetScrollInfo(&si);</p>
<p>CRect rtParent;</p>
<p>CRect rtChild;</p>
<p>GetClientRect(&rtParent);</p>
<p>m_wndExtend.GetWindowRect(&rtChild);</p>
<p>ScreenToClient(&rtChild);</p>
<p>switch(nSBCode)</p>
<p>{</p>
<p>case SB_TOP:</p>
<p>{</p>
<p>si.nPos = si.nMin;</p>
<p>}</p>
<p>break;</p>
<p>case SB_BOTTOM:</p>
<p>{</p>
<p>si.nPos = si.nMax;</p>
<p>}</p>
<p>break;</p>
<p>case SB_LINEUP:</p>
<p>{</p>
<p>si.nPos -= 1;</p>
<p>}</p>
<p>break;</p>
<p>case SB_LINEDOWN:</p>
<p>{</p>
<p>si.nPos += 1;</p>
<p>}</p>
<p>break;</p>
<p>case SB_PAGEUP:</p>
<p>{</p>
<p>si.nPos -= si.nPage;</p>
<p>}</p>
<p>break;</p>
<p>case SB_PAGEDOWN:</p>
<p>{</p>
<p>si.nPos += si.nPage;</p>
<p>}</p>
<p>break;</p>
<p>case SB_THUMBTRACK:</p>
<p>{</p>
<p>si.nPos += nPos;</p>
<p>}</p>
<p>break;</p>
<p>}</p>
<p>if(si.nPos > (int)(si.nMax-si.nMin-si.nPage+1))</p>
<p>si.nPos = si.nMax-si.nMin-si.nPage+1;</p>
<p>if(si.nPos < si.nMin)</p>
<p>si.nPos=si.nMin;</p>
<p>m_iScrollBarPos = si.nPos;</p>
<p>m_vScrollBar.SetScrollInfo(&si);</p>
<p>m_wndExtend.MoveWindow(rtParent.left,rtParent.top - si.nPos,rtChild.Width(),rtChild.Height());</p>
<p>//Invalidate(FALSE);</p>
<p>CWnd::OnVScroll(nSBCode, nPos, pScrollBar);</p>
<p>}</p>
<p>BOOL CExtendMainWnd::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)</p>
<p>{</p>
<p>CRect rtParent;</p>
<p>CRect rtChild;</p>
<p>GetClientRect(&rtParent);</p>
<p>m_wndExtend.GetWindowRect(&rtChild);</p>
<p>ScreenToClient(&rtChild);</p>
<p>SCROLLINFO si;</p>
<p>m_vScrollBar.GetScrollInfo(&si);</p>
<p>if (zDelta > 0)</p>
<p>{</p>
<p>zDelta =  LINE_COUNT;</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>zDelta = -LINE_COUNT;</p>
<p>}</p>
<p>si.nPos += -zDelta;</p>
<p>if(si.nPos > (int)(si.nMax-si.nMin-si.nPage+1))</p>
<p>si.nPos = si.nMax-si.nMin-si.nPage+1;</p>
<p>if(si.nPos < si.nMin)</p>
<p>si.nPos=si.nMin;</p>
<p>m_iScrollBarPos = si.nPos;</p>
<p>m_vScrollBar.SetScrollInfo(&si);</p>
<p>m_wndExtend.MoveWindow(rtParent.left,rtParent.top - si.nPos,rtChild.Width(),rtChild.Height());</p>
<p>return CWnd::OnMouseWheel( nFlags, zDelta, pt);</p>
<p>}</p>
<p>0</p>
<p>回答者:</p>
<p>jackwei86 - 二级   2010-7-19 14:42</p>
<p>我来评论>></p>
<p>提问者对于答案的评价:</p>
<p>thanks</p>
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|文字版|手机版|小黑屋|襄阳城

GMT+8, 2025-5-14 23:30

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表