我刚接触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;
如您所见,滚动条也随客户端一起移动。
答案 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
}