我在对话框上显示了很多内容,一个屏幕显示不完,希望通过垂直滚动条来实现观看下面的内容,只是通过属性修改,虽然出现滚动条,但是放开鼠标,滚动块又回到最上边了,如何实现滚动条的功能呀。

解决方案 »

  1.   

    添加新类:CHFScrollDialog
    用下面的代码覆盖CHFScrollDialog.h
    ------------------------------------------------------------------------------------
    class CHFScrollDialog : public CDialog
    {
    // Construction
    public:
    CHFScrollDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL );
    CHFScrollDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );
    CHFScrollDialog();   // standard constructor// Dialog Data
    //{{AFX_DATA(CHFScrollDialog)
    //}}AFX_DATA
    // Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CHFScrollDialog)
    public:
    protected:
    //}}AFX_VIRTUAL// Implementation
    protected:
    CSize m_sizeDlgOrigin; // Generated message map functions
    //{{AFX_MSG(CHFScrollDialog)
    virtual BOOL OnInitDialog();
    afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnSetFocus(CWnd* pOldWnd);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
    afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    private:
    bool m_bInitiazed;
    int m_nHscrollPage; // Hor scrollbar page step
    int m_nHscrollMax; // hor scrollbar max position
    int m_nHscrollPos; // Current hor scrollbar position
    int m_nVscrollPage; // ver scrollbar page step
    int m_nVscrollMax; // ver scrollbar max position
    int m_nVscrollPos; // Current ver scrollbar position
    };
    ------------------------------------------------------------------------------------
      

  2.   

    下面的覆盖CHFScrollDialog.cpp
    -----------------------------------------------------------------------------CHFScrollDialog::CHFScrollDialog()
    : CDialog()
    {
    m_nHscrollPos = 0;
    m_nVscrollPos = 0;
    m_bInitiazed = false;
    //{{AFX_DATA_INIT(CHFScrollDialog)
    //}}AFX_DATA_INIT
    }CHFScrollDialog::CHFScrollDialog(LPCTSTR lpszTemplateName, CWnd *pParentWnd)
    : CDialog(lpszTemplateName, pParentWnd)
    {
    m_nHscrollPos = 0;
    m_nVscrollPos = 0;
    m_bInitiazed = false;
    }CHFScrollDialog::CHFScrollDialog(UINT nIDTemplate, CWnd *pParentWnd)
    : CDialog(nIDTemplate, pParentWnd)
    {
    m_nHscrollPos = 0;
    m_nVscrollPos = 0;
    m_bInitiazed = false;
    }BEGIN_MESSAGE_MAP(CHFScrollDialog, CDialog)
    //{{AFX_MSG_MAP(CHFScrollDialog)
    ON_WM_VSCROLL()
    ON_WM_HSCROLL()
    ON_WM_SIZE()
    ON_WM_SETFOCUS()
    ON_WM_LBUTTONDOWN()
    ON_WM_MOUSEWHEEL()
    ON_WM_KEYDOWN()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CHFScrollDialog message handlersBOOL CHFScrollDialog::OnInitDialog() 
    {
    CDialog::OnInitDialog(); m_bInitiazed = true;
    // TODO: Add extra initialization here
    CRect rect;
    GetClientRect(rect);
    m_sizeDlgOrigin = rect.Size();
    m_nHscrollPage = m_sizeDlgOrigin.cx + 1;
    m_nVscrollPage = m_sizeDlgOrigin.cy + 1;

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }void CHFScrollDialog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    // TODO: Add your message handler code here and/or call default
    int yAmount = 0; //Y增量
    switch(nSBCode)
    {
    case SB_TOP:
    yAmount = -m_nVscrollPos;
    break;
    case SB_BOTTOM:
    yAmount = m_nVscrollMax - m_nVscrollPos;
    break;
    case SB_LINEUP:
    yAmount = -5;
    break;
    case SB_LINEDOWN :
    yAmount = 5;
    break;
    case SB_PAGEUP:
    yAmount = -(m_nVscrollPage - 50);
    if(yAmount > 0) yAmount = 0;
    break;
    case SB_PAGEDOWN:
    yAmount = m_nVscrollPage - 50;
    if(yAmount < 0) yAmount = 0;
    break;
    case SB_THUMBTRACK:
    yAmount = nPos - m_nVscrollPos;
    break;
    default:
    yAmount = 0;
    } int nVscrollPos = m_nVscrollPos;
    nVscrollPos += yAmount;
    if(nVscrollPos < 0)
    {
    yAmount = 0 - m_nVscrollPos;
    }
    else if(nVscrollPos > m_nVscrollMax)
    {
    yAmount = m_nVscrollMax - m_nVscrollPos;
    }
    if(yAmount != 0)
    {
    ScrollWindow(0, -yAmount); m_nVscrollPos += yAmount;
    SetScrollPos(SB_VERT, m_nVscrollPos);
    }

    CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
    }void CHFScrollDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    // TODO: Add your message handler code here and/or call default
    int xAmount = 0; //X增量
    switch(nSBCode)
    {
    case SB_TOP:
    xAmount = -m_nHscrollPos;
    break;
    case SB_BOTTOM:
    xAmount = m_nHscrollMax - m_nHscrollPos;
    break;
    case SB_LINEUP:
    xAmount = -5;
    break;
    case SB_LINEDOWN :
    xAmount = 5;
    break;
    case SB_PAGEUP:
    xAmount = -m_nHscrollPage;
    break;
    case SB_PAGEDOWN:
    xAmount = m_nHscrollPage;
    break;
    case SB_THUMBTRACK:
    xAmount = nPos - m_nHscrollPos;
    break;
    default:
    xAmount = 0;
    } int nHscrollPos = m_nHscrollPos;
    nHscrollPos += xAmount;
    if(nHscrollPos < 0)
    {
    xAmount = 0 - m_nHscrollPos;
    }
    else if(nHscrollPos > m_nHscrollMax)
    {
    xAmount = m_nHscrollMax - m_nHscrollPos;
    }
    if(xAmount != 0)
    {
    ScrollWindow(-xAmount, 0); m_nHscrollPos += xAmount;
    SetScrollPos(SB_HORZ, m_nHscrollPos);
    }

    CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
    }void CHFScrollDialog::OnSize(UINT nType, int cx, int cy) 
    {
    CDialog::OnSize(nType, cx, cy);

    // TODO: Add your message handler code here
    if(m_bInitiazed && (nType==SIZE_RESTORED || nType==SIZE_MAXIMIZED || nType==SIZE_MAXSHOW) )
    {
    CRect rectCln;
    GetClientRect(rectCln); // Vert scrollbar
    // rerecord state;
    m_nVscrollMax = m_sizeDlgOrigin.cy - rectCln.Height();
    m_nVscrollPage = rectCln.Height() + 1;
    if(m_nVscrollMax <= 0)
    {
    ScrollWindow(0, -m_nVscrollPos);
    m_nVscrollPos = 0;
    } SCROLLINFO info;
    ::ZeroMemory(&info, sizeof(SCROLLINFO));
    info.cbSize = sizeof(SCROLLINFO);
    info.fMask = SIF_RANGE|SIF_PAGE|SIF_POS;
    info.nMin = 0;
    info.nMax = m_sizeDlgOrigin.cy;
    info.nPos = m_nVscrollPos;
    info.nPage = m_nVscrollPage;
    SetScrollInfo( SB_VERT, &info ); // horizon scrollbar
    // rerecord state;
    m_nHscrollMax = m_sizeDlgOrigin.cx - rectCln.Width();
    m_nHscrollPage = rectCln.Width() + 1;
    if(m_nHscrollMax <= 0)
    {
    ScrollWindow(0, -m_nHscrollPos);
    m_nHscrollPos = 0;
    } // ::ZeroMemory(&info, sizeof(SCROLLINFO));
    info.cbSize = sizeof(SCROLLINFO);
    info.fMask = SIF_RANGE|SIF_PAGE|SIF_POS;
    info.nMin = 0;
    info.nMax = m_sizeDlgOrigin.cx;
    info.nPos = m_nHscrollPos;
    info.nPage = m_nHscrollPage;
    SetScrollInfo( SB_HORZ, &info );
    }
    }void CHFScrollDialog::OnSetFocus(CWnd* pOldWnd) 
    {
    // CDialog::OnSetFocus(pOldWnd);

    // TODO: Add your message handler code here

    }void CHFScrollDialog::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default

    CDialog::OnLButtonDown(nFlags, point); if(GetFocus() != this)
    {
    SetFocus();
    }
    }BOOL CHFScrollDialog::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
    {
    // TODO: Add your message handler code here and/or call default
    int yAmount = (-zDelta)/6; //Y增量
    int nVscrollPos = m_nVscrollPos;
    nVscrollPos += yAmount;
    if(nVscrollPos < 0)
    {
    yAmount = 0 - m_nVscrollPos;
    }
    else if(nVscrollPos > m_nVscrollMax)
    {
    yAmount = m_nVscrollMax - m_nVscrollPos;
    }
    if(yAmount != 0)
    {
    ScrollWindow(0, -yAmount); m_nVscrollPos += yAmount;
    SetScrollPos(SB_VERT, m_nVscrollPos);
    } return CDialog::OnMouseWheel(nFlags, zDelta, pt);
    }void CHFScrollDialog::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    // TODO: Add your message handler code here and/or call default
    int yAmount = 0; //Y增量
    if(nChar == VK_NEXT)
    {
    yAmount = m_nVscrollPage - 50;
    if(yAmount < 0)
    {
    yAmount = 0;
    }
    }
    else if(nChar == VK_PRIOR)
    {
    yAmount = -(m_nVscrollPage - 50);
    if(yAmount > 0)
    {
    yAmount = 0;
    }
    } int nVscrollPos = m_nVscrollPos;
    nVscrollPos += yAmount;
    if(nVscrollPos < 0)
    {
    yAmount = 0 - m_nVscrollPos;
    }
    else if(nVscrollPos > m_nVscrollMax)
    {
    yAmount = m_nVscrollMax - m_nVscrollPos;
    }
    if(yAmount != 0)
    {
    ScrollWindow(0, -yAmount); m_nVscrollPos += yAmount;
    SetScrollPos(SB_VERT, m_nVscrollPos);
    } CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
    }-----------------------------------------------------------------------------
      

  3.   

    对要加入滚动条的对话框:
    CRyxxdjDlg.h中
    class CRyxxdjDlg : public CHFScrollDialog//注意
    {
    //....
    };
    ***********************************************************
    CRyxxdjDlg.cpp中:CRyxxdjDlg::CRyxxdjDlg(CWnd* pParent /*=NULL*/)
    : CHFScrollDialog(CRyxxdjDlg::IDD, pParent)//注意
    {
    }BEGIN_MESSAGE_MAP(CRyxxdjDlg, CHFScrollDialog)//注意
    END_MESSAGE_MAP()BOOL CRyxxdjDlg::OnInitDialog() 
    {
    CHFScrollDialog::OnInitDialog();//注意
    //....
    }
    在对话框属性->Styles->Vertical Scroll打勾就OK了。
      

  4.   

    To:fupinger(仙人抚我颈★结发授长生) 
    哥们,我不知道 CDialog::OnHScroll(nSBCode, nPos, pScrollBar);是否调用了ScrollWindow,如果没有调用,那是不成的