mfc滚动条的相关问题
我现在需要做一个应用软件,需要输入大量的信息,在对话框的左侧是输入区,右边是预览区。由于要输入大量的信息,需要大量的Edit控件。这样左侧的有限的空间是远远不够的。哪位高...
我现在需要做一个应用软件,需要输入大量的信息,在对话框的左侧是输入区,右边是预览区。
由于要输入大量的信息,需要大量的 Edit 控件 。这样左侧的有限的空间是远远不够的。
哪位高手可以实现类似“滑动条”那样的东西,能够使 这些控件都存在于当前对话框中,然后用“滑动条”来拖动。
如解决必有高分相赠,谢谢 展开
由于要输入大量的信息,需要大量的 Edit 控件 。这样左侧的有限的空间是远远不够的。
哪位高手可以实现类似“滑动条”那样的东西,能够使 这些控件都存在于当前对话框中,然后用“滑动条”来拖动。
如解决必有高分相赠,谢谢 展开
2个回答
展开全部
首先你要有一个主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);
}
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);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询