mfc滚动条的相关问题

我现在需要做一个应用软件,需要输入大量的信息,在对话框的左侧是输入区,右边是预览区。由于要输入大量的信息,需要大量的Edit控件。这样左侧的有限的空间是远远不够的。哪位高... 我现在需要做一个应用软件,需要输入大量的信息,在对话框的左侧是输入区,右边是预览区。
由于要输入大量的信息,需要大量的 Edit 控件 。这样左侧的有限的空间是远远不够的。
哪位高手可以实现类似“滑动条”那样的东西,能够使 这些控件都存在于当前对话框中,然后用“滑动条”来拖动。
如解决必有高分相赠,谢谢
展开
 我来答
百度网友a9ca369
2010-07-19 · TA获得超过143个赞
知道小有建树答主
回答量:200
采纳率:0%
帮助的人:167万
展开全部
首先你要有一个主Wnd CExtendMainWnd ,里面放一个子Wnd CExtendWnd m_wndExtend和一个CScrollBar m_vScrollBar,Cedit都放在子Wnd中,子Wnd跟主Wnd的高度和Y坐标都是相同的,宽度留一个地方放ScrollBar.拖动滚动条的时候,把子Wnd MoveWindow到相应的位置。你的CEdit每个都有高度的,可以根据N个CEdit高度和与ParentWnd.GetClientRect 的高度进行比较,如果和超过了客户端的高度,
CScrollBar.ShowWindow(SW_SHOW)(之前先把CScrollBar 创建好后 Hide).
后面再来响应ON_WM_VSCROLL()

主要的代码:
void CExtendMainWnd::CreateWnd(CWnd* pParent,int iColorLevel,CRect& rect,int iDefItemHeight )
{
CWnd::Create(NULL,NULL,WS_CHILD|WS_VISIBLE,rect,pParent,1001);
m_wndExtend.CreateWnd(this,m_iColorlevel,rect,iDefItemHeight);
m_vScrollBar.Create(WS_CHILD|SB_VERT,CRect(0,0,0,0),this,1002);
}
每次添加完一个CEdit
void CExtendWnd::AddItemWnd(CBaseItemWnd* pBaseItemWnd)
{
//我这里是动态添加的
ExtendItem* pExtendItem = new ExtendItem;
pExtendItem->m_pBaseWnd = pBaseItemWnd;
pExtendItem->m_pBaseWnd->CreateWnd(CRect(0,0,0,0),m_iColorLevel,this,m_uIDWnd );
m_uIDWnd ++;//

Arrange();
GetParent()->SendMessage(WM_WHETHERNEEDSCROLL,0,0);//加完给父窗口发消息去知道需不需要加滚动条
}
消息处理
LRESULT CExtendMainWnd::OnWhetherNeedScroll(WPARAM wParam,LPARAM lParam)
{
UpdataScrollBar();
Arrange();
return 0;
}

就UpdataScrollBar();
void CExtendMainWnd::UpdataScrollBar()
{
CRect rtParent;
GetWindowRect(&rtParent);
CRect rtWindow;
m_wndExtend.GetWindowRect(&rtWindow);
if ( m_wndExtend.GetDisplayHeight() > rtParent.Height() )
{

SCROLLINFO info;
info.cbSize = sizeof(SCROLLINFO);
info.fMask = SIF_ALL;
info.nMin = 0;
info.nMax = m_wndExtend.GetDisplayHeight();
info.nPage = rtParent.Height();
info.nPos = m_iScrollBarPos;
m_vScrollBar.SetScrollInfo(&info);
m_vScrollBar.ShowWindow(SW_SHOW);
m_bNeedScrollBar = TRUE;
}
else
{
m_vScrollBar.ShowWindow(SW_HIDE);
m_bNeedScrollBar = FALSE;
}
}

拖动滚动条的消息响应
void CExtendMainWnd::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
SCROLLINFO si;
m_vScrollBar.GetScrollInfo(&si);
CRect rtParent;
CRect rtChild;
GetClientRect(&rtParent);
m_wndExtend.GetWindowRect(&rtChild);
ScreenToClient(&rtChild);
switch(nSBCode)
{
case SB_TOP:
{
si.nPos = si.nMin;
}
break;
case SB_BOTTOM:
{
si.nPos = si.nMax;
}
break;
case SB_LINEUP:
{
si.nPos -= 1;
}
break;
case SB_LINEDOWN:
{
si.nPos += 1;
}
break;
case SB_PAGEUP:
{
si.nPos -= si.nPage;
}
break;
case SB_PAGEDOWN:
{
si.nPos += si.nPage;
}
break;
case SB_THUMBTRACK:
{
si.nPos += nPos;
}
break;
}
if(si.nPos > (int)(si.nMax-si.nMin-si.nPage+1))
si.nPos = si.nMax-si.nMin-si.nPage+1;
if(si.nPos < si.nMin)
si.nPos=si.nMin;
m_iScrollBarPos = si.nPos;
m_vScrollBar.SetScrollInfo(&si);
m_wndExtend.MoveWindow(rtParent.left,rtParent.top - si.nPos,rtChild.Width(),rtChild.Height());
//Invalidate(FALSE);
CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
}

BOOL CExtendMainWnd::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
CRect rtParent;
CRect rtChild;
GetClientRect(&rtParent);
m_wndExtend.GetWindowRect(&rtChild);
ScreenToClient(&rtChild);
SCROLLINFO si;
m_vScrollBar.GetScrollInfo(&si);
if (zDelta > 0)
{
zDelta = LINE_COUNT;
}
else
{
zDelta = -LINE_COUNT;
}
si.nPos += -zDelta;
if(si.nPos > (int)(si.nMax-si.nMin-si.nPage+1))
si.nPos = si.nMax-si.nMin-si.nPage+1;
if(si.nPos < si.nMin)
si.nPos=si.nMin;
m_iScrollBarPos = si.nPos;
m_vScrollBar.SetScrollInfo(&si);
m_wndExtend.MoveWindow(rtParent.left,rtParent.top - si.nPos,rtChild.Width(),rtChild.Height());

return CWnd::OnMouseWheel( nFlags, zDelta, pt);
}
樱花树物语
2010-07-19
知道答主
回答量:10
采纳率:0%
帮助的人:0
展开全部
你把左面的输入区用子窗口实现,右边的预览区用一个子窗口实现,那样的话你给左边的子窗口加个滑动条就行了~!之间的通信可以用发消息传递(左边的子窗口发给右边,或者左边的子窗口给父窗口,父窗口再传给右边的窗口)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式