现在的位置: 首页 > 综合 > 正文

[WM]CDialog ScollBar的显示

2011年12月12日 ⁄ 综合 ⁄ 共 1903字 ⁄ 字号 评论关闭

CDialog的ScrollBar


窗口上面的控件超出了Window的显示区域,就需要Scrollbar.这一操作在C#里面是极其简单的,但是在Win32(MFC)里面,就不是那么简单了……下面给出怎么搞出来Scrollbar,给那些需要帮助的人,以及给自己做一个标记.


设类CMyDialog继承自CDialog.

给CMyDialog添加成员:

 

    CRect m_ClientRect;
    int  m_nVertInc,m_nVscrollMax,m_nVscrollPos;
    void SetupScrollbars();
    void ResetScrollbars();


下来就是显示Scrollbar.需要的时候显示,办法很简答,就是获取最下面一个控件的RECT的bottom,如果bottom>窗口的Bottom,那么就显示:

//这个我没仔细看MSDN,发现能让Scrollbar出来我就没管了..

this->EnableScrollBarCtrl(1,TRUE);

 

下来就是处理WM_VSCROLL消息:

 

void CMyPropertyPage::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	int nInc; 

	switch (nSBCode)
	{
	case SB_TOP:        nInc = -m_nVscrollPos;               break;
	case SB_BOTTOM:     nInc = m_nVscrollMax-m_nVscrollPos;  break;
	case SB_LINEUP:     nInc = -1;                           break;
	case SB_LINEDOWN:   nInc = 1;                            break;
	case SB_PAGEUP:     nInc = min(-1, -m_nVertInc);         break;
	case SB_PAGEDOWN:   nInc = max(1, m_nVertInc);           break;
	case SB_THUMBTRACK: nInc = nPos - m_nVscrollPos;         break;
	default:            nInc = 0;
	}

	nInc = max(-m_nVscrollPos, min(nInc, m_nVscrollMax - m_nVscrollPos));

	if (nInc)
	{
		m_nVscrollPos += nInc;
		int iMove = -VERT_PTS * nInc;
		//就这一句
		ScrollWindowEx(0, iMove, NULL, NULL,NULL,NULL,SW_SCROLLCHILDREN);
		SetScrollPos(SB_VERT, m_nVscrollPos, TRUE);
	}

	CPropertyPage::OnVScroll(nSBCode, nPos, pScrollBar);	
}

 

 

//重置Scrollbar的位置

 

void CMyPropertyPage::ResetScrollbars()
{
	//Scroll the Window to its initial Position
	ScrollWindow(0, m_nVscrollPos*VERT_PTS, NULL, NULL);
	m_nVscrollPos = 0;

	//Setup and Initialize a Vertical Scroll bar
	//You can do the same for Horizontal Scroll bar
	SetScrollPos(SB_VERT, m_nVscrollPos, TRUE);
}

//设置Scrollbar的边界

 

void CMyPropertyPage::SetupScrollbars()
{
	CRect tempRect;
	GetClientRect(&tempRect);

	m_nVertInc = (m_ClientRect.Height() - tempRect.Height())/VERT_PTS;

	m_nVscrollMax = max(0, m_nVertInc);
	m_nVscrollPos = min(m_nVscrollPos, m_nVscrollMax);
	SetScrollRange(SB_VERT, 0, m_nVscrollMax, FALSE);
	SetScrollPos(SB_VERT, m_nVscrollPos, TRUE);	
}


下来别忘了添加对WM_VSCROLL消息的映射:

ON_WM_VSCROLL(WM_VSCROLL,&CMyDialog::OnVScroll)

 

 

这样,那个Scrollbar就能工作了.


PS:

WinCE上没有ScrollWindow,只有ScrollWindowEx这个API.MFC里面自己有一个ScrollWindow,不知道怎么实现的,貌似不好使.

抱歉!评论已关闭.