MFC:使用CScrollView时如何访问滚动条



我使用以下设置创建了一个项目。

  + Application type: Single document
  + Use Unicode libraries: NO
  + Project style: MFC standard
  + Use of MFC: Use MFC in a shared DLL
  + Base class: CScrollView

我只修改OnDraw来输出很多行。

void CMRCView::OnDraw(CDC* pDC)
{
    CMRCDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
    // TODO: add draw code for native data here
    CFont font;
    int font_pixels_height;
    /* set up font and figure out its height, omit here ... */
    CRect rect;
    GetClientRect(&rect);
    rect.bottom = font_pixels_height;
    CFont *old_font = pDC->SelectObject(&font);
    for (int i = 0; i < 10000; ++i)
    {
        pDC->DrawText("hello world 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789",
                      -1, &rect, DT_LEFT);
        rect.top += font_pixels_height;
        rect.bottom += font_pixels_height;
    }
    pDC->SelectObject(old_font);
}

输出还可以。当我展开窗口时,我可以看到更多的行,但没有垂直或水平的滚动条。

我认为您需要更仔细地阅读文档。CScrollView类定义了相对较少的附加(相对于其基类CView(方法。如果可滚动区域大于可见的客户端区域,它将自动显示滚动条。一些关键方法是SetScrollSizes()GetScrollPosition()GetClientRect()(继承自CWnd(。

在任何情况下,都可能需要重新计算可滚动区域的大小(并调用SetScrollSizes()(,例如更改CDocument中的数据,或者当用户更改某些"查看选项"时。

然后有两种方法来绘制(OnDraw()(您的文档:

  • 绘制整个可滚动区域。这很容易实现,但在某种程度上是"浪费"的,因为它可能会绘制一个不可见的区域
  • 只绘制可滚动区域的可见部分。调用GetTotalSize()(或者只检查之前传递给SetScrollSizes()的值——您必须存储它们(、GetClientRect()GetScrollPosition(),以确定需要绘制的内容。您应该只绘制GetClientRect()返回的矩形(您需要将其偏移GetScrollPosition()返回的滚动位置(

在任何一种情况下,您都必须检查可滚动的大小是否比可见的客户端矩形小(,以及在水平和垂直方向上。如果是,请用一些中性色填充其余部分,表示"无数据"或"空"区域。最好使用GetSysColor()(如COLOR_3DFACECOLOR_BTNFACE(返回的标准系统颜色,或一些自定义的深色画笔。

最新更新