滚动条与MFC中的客户端一起移动

时间:2019-07-16 17:02:54

标签: c++ user-interface mfc scrollbar

我刚接触MFC。我实现了一个滚动条来滚动客户区。当我向下滚动时,滚动条也会与客户端一起移动。我希望滚动条保持原样,仅移动客户端。

我尝试剪切滚动条并仅移动客户端,但无法正常工作。我使用ScrollWindow()这样做,但是我不知道如何剪辑滚动条。我不知道我是否需要滚动条的坐标/尺寸或要裁剪的内容,所以现在我将这些参数设置为NULL。我只专注于首先使用向上和向下按钮来使客户端正确移动。

int UpPos;
    if ((pScrollBar == (CScrollBar *)&mMotorScrollBar)) {

        // Determine the new position of scroll box.
        int CurPos = mMotorScrollBar.GetScrollPos();

        switch (nSBCode)
        {
        case SB_TOP:      // Scroll to top.
            CurPos = 0;
            break;

        case SB_BOTTOM:    // Scroll to bottom.
            CurPos = 122;
            break;

        case SB_ENDSCROLL: // End scroll.
            break;

        case SB_LINEUP: // Scroll up when arrow up button is clicked.
            if (CurPos > 0)
                CurPos--;
                UpPos = -CurPos;
                ScrollWindow(0, UpPos, NULL, NULL);
            break;

        case SB_LINEDOWN:   // Scroll down when arrow down button is clicked.
            if (CurPos < 122)
                CurPos++;
                ScrollWindow(0, CurPos, NULL, NULL);
            break;

Application before I scroll

Application after I scroll.

Window Properties

如您所见,滚动条也随客户端一起移动。

1 个答案:

答案 0 :(得分:2)

删除滚动条控件,并使用SetScrollInfo添加垂直滚动条。创建窗口时必须调用SetScrollInfo,它将添加滚动条并调整工作区。

此外,您可以编辑对话框并设置垂直滚动选项。该选项除了调整对话框编辑器中对话框控件的位置外,实际上不执行任何操作。必须在运行时使用SetScrollInfo创建实际的滚动条。示例:

BOOL CMyPropertyPage::OnInitDialog()
{
    BOOL res = CPropertyPage::OnInitDialog();
    SCROLLINFO si = { sizeof(si) };
    si.fMask = SIF_ALL;
    si.nMax = 122; //<- this should be calculated dynamically for DPI compatibility
    si.nPage = 1;
    SetScrollInfo(SB_VERT, &si, TRUE);
    return res;
}

void CMyPropertyPage::OnVScroll(UINT sbCode, UINT, CScrollBar*)
{
    SCROLLINFO si = { sizeof(si) };
    GetScrollInfo(SB_VERT, &si, SIF_ALL);
    int save = si.nPos;
    switch(sbCode)
    {
    case SB_LINEDOWN:      si.nPos += 1; break;
    case SB_LINEUP:        si.nPos -= 1; break;
    case SB_PAGEDOWN:      si.nPos += si.nPage; break;
    case SB_PAGEUP:        si.nPos -= si.nPage; break;
    case SB_TOP:           si.nPos = 0; break;
    case SB_BOTTOM:        si.nPos = si.nMax; break;
    case SB_THUMBTRACK:    si.nPos = si.nTrackPos; break;
    default:break;
    }
    if(si.nPos < 0) si.nPos = 0;
    if(si.nPos > si.nMax) si.nPos = si.nMax;
    SetScrollPos(SB_VERT, si.nPos); //update scrollbar position
    ScrollWindow(0, save - si.nPos); //scroll the window
}