给对话框应用程序添加滚动条+处理过界空白区问题(滚动块太小问题)

    技术2022-06-08  45

    在对话框上要应用滚动条,首先当然是要将对话框的属性vertical scroll选中(在这里只介绍纵向滚动条,横向滚动条与之原理相同)。然后是按Ctlr+w进入classwizard选中对话消息WM_VSCROLL,并添加它的响应函数,接着进入代码编辑区,写入代码:void CRq::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

    {// TODO: Add your message handler code here and/or call defaultSCROLLINFO scrollinfo;GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

    switch (nSBCode)

    {

    case SB_BOTTOM:

    ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMax));

    scrollinfo.nPos = scrollinfo.nMax;

    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

    break;

    case SB_TOP:

    ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMin));

    scrollinfo.nPos = scrollinfo.nMin;

    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

    break;

    case SB_LINEUP:

    scrollinfo.nPos -= 5;

    if (scrollinfo.nPos<scrollinfo.nMin){

    scrollinfo.nPos = scrollinfo.nMin;

    break;}

    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

    ScrollWindow(0,5);

    break;

    case SB_LINEDOWN:scrollinfo.nPos += 5;

    if (scrollinfo.nPos>scrollinfo.nMax)

    {

    scrollinfo.nPos = scrollinfo.nMax;

    break;

    }

    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

    ScrollWindow(0,-5);

    break;

    case SB_PAGEUP:

    scrollinfo.nPos -= 5;

    if (scrollinfo.nPos<scrollinfo.nMin){

    scrollinfo.nPos = scrollinfo.nMin;

    break;

    }

    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

    ScrollWindow(0,5);

    break;

    case SB_PAGEDOWN:

    scrollinfo.nPos += 5; if (scrollinfo.nPos>scrollinfo.nMax)

    {

    scrollinfo.nPos = scrollinfo.nMax;

    break;

    }

    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

    ScrollWindow(0,-5);

    break;

    case SB_ENDSCROLL:

    // MessageBox("SB_ENDSCROLL");

    break;

    case SB_THUMBPOSITION:

    // ScrollWindow(0,(scrollinfo.nPos-nPos));

    // scrollinfo.nPos = nPos;

    // SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

    break;

    case SB_THUMBTRACK:

    ScrollWindow(0,(scrollinfo.nPos-nPos));

    scrollinfo.nPos = nPos;

    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);

    break;

    }CDialog::OnVScroll(nSBCode, nPos, pScrollBar);}以上代码完成后,滚动条已可以使用了。但是应该如何将其它控件安排在对话框呢?很简单,你想用多大的对话框就将它拉多大,只需要在对话框所用的xxxx.cpp文件的void Cxxxx::DoDataExchange(CDataExchange* pDX)函数体中写入代码:SetWindowPos(NULL,0,0,720,600,SWP_NOMOVE | SWP_NOZORDER);其中720和600两个数字分别为对话框创建时的宽度和高度。这样就可以方便地使用滚动条了。

    网上找了很多人都用这个代码,但是基本都是到这里就结束了,但是这是还存在一点问题,就是滚动条的范围超大,滚动块拉到下面就是空白区,这里提供个解决方法:

    在自己的对话框类中添加消息响应函数OnSize()

    void C******Dlg::OnSize(UINT nType, int cx, int cy) {SCROLLINFO scrollinfo;

    SetScrollRange (SB_VERT, 0, 600, TRUE);//这个就是设置你的滚动条的范围

    GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);scrollinfo.nPage=400;//页的大小,SetScrollInfo(SB_VERT,&scrollinfo,SIF_PAGE);

    CDialog::OnSize(nType, cx, cy);// TODO: Add your message handler code here}滚动块的大小就是400/600即你滚动条总长度的三分之二,自己调调看这两个数,体会一下滚动块的变化就知道了。


    最新回复(0)