我使用以下设置创建了一个项目。
+ 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_3DFACE
或COLOR_BTNFACE
(返回的标准系统颜色,或一些自定义的深色画笔。