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