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

MFC:使用CScrollView时如何访问滚动条?,mfc,Mfc,我使用以下设置创建一个项目 + 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* pDo

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

  + 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);
}
void CMRCView::OnDraw(CDC*pDC)
{
CMRCDoc*pDoc=GetDocument();
断言有效(pDoc);
if(!pDoc)
返回;
//TODO:在此处添加本机数据的绘图代码
CFont字体;
int字体像素高度;
/*设置字体并计算其高度,忽略此处*/
正确无误;
GetClientRect(&rect);
rect.bottom=字体\像素\高度;
CFont*old_font=pDC->SelectObject(&font);
对于(int i=0;i<10000;++i)
{
pDC->DrawText(“你好世界0123456789 0123456789 0123456789 0123456789 0123456789 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_左);
rect.top+=字体像素高度;
rect.bottom+=字体像素高度;
}
pDC->SelectObject(旧字体);
}

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

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

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

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

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

在这两种情况下,您还必须检查可滚动的大小是否比可见的客户端矩形小),以及水平方向和垂直方向。如果是这样,用一些中性颜色填充其余部分,表示“无数据”或“空白”区域。最好使用由
GetSysColor()
返回的标准系统颜色(例如
color\u 3face
color\u BTNFACE
),或一些自定义的深色笔刷。

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

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

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

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

在这两种情况下,您还必须检查可滚动的大小是否比可见的客户端矩形小),以及水平方向和垂直方向。如果是这样,用一些中性颜色填充其余部分,表示“无数据”或“空白”区域。最好使用由
GetSysColor()
返回的标准系统颜色(例如
color\u 3face
color\u BTNFACE
),或一些自定义的深色笔刷。

谢谢。所以实际上我需要在任何显示发生之前计算出总显示面积。对于一个简单的电子表格,这可能很容易。但在我的情况下,我想我可能需要检查每一条记录,因为需要注意的是不同的字体和文本包装。有没有更简单的计算方法?我不能回答这个问题,因为我不知道你的数据是什么。如果文档由固定长度的页面组成,可能会更容易,但如果页面长度可变,则会更难。
CScrollView
实现要求提前知道文档的大小(但仍然可以更改)。我只在成像应用中使用过它,当然一打开图像就知道图像的大小。谢谢。所以实际上我需要在任何显示发生之前计算出总显示面积。对于一个简单的电子表格,这可能很容易。但在我的情况下,我想我可能需要检查每一条记录,因为需要注意的是不同的字体和文本包装。有没有更简单的计算方法?我不能回答这个问题,因为我不知道你的数据是什么。如果文档由固定长度的页面组成,可能会更容易,但是如果