MFC里怎么给主窗口加滚动条

MFC里怎么给主窗口加滚动条,第1张

MFC中,窗口的滚动条是“自动”出现的,而不必自己添加。

但前提是您要选用哪种CView的继承类。

您要选用CScollView,那么,在InitialUpdate函数中,就可以设置窗口的大小。

那么,运行的时候,如果窗口的尺寸小于当初的设置,那么滚动条就自动出现了。

建议:认真看看《Visual C++技术内幕》

1、建立工程时,将 View 类继承自 CScrollView

2、在 OnInitialUpdate 中添加初始化时 Scroll 的相关属性值

CSize sizeTotal(0,0)

SetScrollSizes(MM_TEXT,sizeTotal)

3、打开文件 ( 图像后 ) 根据图像的大小,设置滚动属性值

ChangeScrollRange() // 自定义函数

4、在 View 类中添加成员变量。

作用是存储图像显示位置与原点的 offset

int m_ImgVScrollPos// VScroll distance

int m_ImgHScrollPos// HScroll distance

5、滚动处理

添加自定义响应 WM_VSCROLL 、 WM_HSCROLL 消息的事件函数: OnVScroll 、 OnHScroll

void CSockIIView :: OnVScroll ( UINT nSBCode , UINT nPos , CScrollBar * pScrollBar )

{

SCROLLINFO si

GetScrollInfo ( SB_VERT ,&si , SIF_ALL )

m_ImgVScrollPos = si . nPos

Invalidate ( TRUE )

CScrollView :: OnVScroll ( nSBCode , nPos , pScrollBar )

}

6、图像显示

更改 OnPaint 函数中图像显示的代码:

dc . BitBlt ( rc . left , rc . top , rc . Width (), rc . Height (), m_pMemDC , rc . left , rc . top , SRCCOPY )

为:

dc.BitBlt(rc.left,rc.top,rc.Width(),rc.Height(),m_pMemDC,(rc.left+m_ImgHScrollPos),(rc.top+m_ImgVScrollPos),SRCCOPY)

对话框滚动会影响客户区的任何控件,包括工具栏。

而标准MFC对话框,只能将工具栏放在客户区,因此这个问题没有简单的解决办法,自己在这个基础上去解决问题,非常困难。

比较省事儿的办法,就是重新创建一个工程,做成单文档CFormView模式,这样Form里面的滚动,只影响View客户区内容,不会影响在框架区域的工具条、状态条等东西了。

补充一下,对话框模式还有另外一个办法,就是在控件不多或者需要影响的控件不多的情况下,自己响应滚动条的OnVScroll和OnHScroll事件,自己处理需要滚动的东西。这样的滚动条是伪滚动的,经常用于对话框单一控件响应滚动事件(并将滚动条只放在这一个控件边上)。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11895190.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存