忘川echo 2023-06-02 15:15 采纳率: 20%
浏览 89
已结题

MFC滚动条如何正确使用

MFC对话框中有一些按钮和列表,想要做一个垂直滚动条使得当对话框较小,里面内容显示不全时,能通过滚动条显示。
现在遇到的问题是,滚动条滚动至最下方,按理来说对话框也应该显示到最下方的内容,但是会多显示一部分空白,这是为什么啊?
目前用的是对话框的垂直滚动条属性,没用垂直滚动条控件

img

void CUIDialog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    SCROLLINFO scrollinfo;
    GetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
    int unit = 3;
    switch (nSBCode)
    {
    case SB_LINEUP:          //滚动一行
        scrollinfo.nPos -= 1;
        if (scrollinfo.nPos < scrollinfo.nMin)
        {
            scrollinfo.nPos = scrollinfo.nMin;
            break;
        }
        SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
        ScrollWindow(0, unit);
        break;
    case SB_LINEDOWN:           //向下滚动一行
        scrollinfo.nPos += 1;
        if (scrollinfo.nPos + scrollinfo.nPage > scrollinfo.nMax)  //此处要加上滑块的长度,再作判断
        {
            scrollinfo.nPos = scrollinfo.nMax;
            break;
        }
        SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
        ScrollWindow(0, -unit);
        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, unit * 5);
        break;
    case SB_PAGEDOWN:        //向下滚动一页        
        scrollinfo.nPos += 5;
        if (scrollinfo.nPos + scrollinfo.nPage >= scrollinfo.nMax)  //此处要加上滑块的长度,再作判断
        {
            scrollinfo.nPos = scrollinfo.nMax;
            break;
        }
        SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
        ScrollWindow(0, -unit * 5);
        break;
    case SB_ENDSCROLL:
        break;
    case SB_THUMBPOSITION:
        break;
    case SB_THUMBTRACK:        //将滚动条拖动到指定位置       
        ScrollWindow(0, (scrollinfo.nPos - nPos) * 10);
        scrollinfo.nPos = nPos;
        SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
        break;
    }
    CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

  • 写回答

5条回答 默认 最新

  • Minuw 2023-06-02 15:24
    关注

    可能是由于滚动条的范围和页面范围的设置问题导致的
    你可以参考试试这样设置

    CRect rectClient;
    GetClientRect(&rectClient);
    
    CRect rectWindow;
    GetWindowRect(&rectWindow);
    
    int nWidth = rectClient.Width();
    int nHeight = rectClient.Height();
    
    int nScrollHeight = rectWindow.Height() - nHeight;
    int nPageHeight = nHeight;
    
    m_scrollBarVert.SetScrollRange(0, nScrollHeight);
    m_scrollBarVert.SetScrollPage(nPageHeight);
    

    m_scrollBarVert是垂直滚动条控件的成员变量。通过计算对话框控件的大小和位置,以及滚动条的范围和页面范围,我们确保滚动条可以滚动到对话框的最底部,而不会出现空白部分。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月9日
  • 赞助了问题酬金15元 6月2日
  • 创建了问题 6月2日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。