📄 untitled-47.txt
字号:
第2章在窗口中绘图83
逻辑将"Code传送的通知转换成带符号的"Delta值,表示窗口需要滚动的像素数目。一旦
计算出"Delta,滚动条位置会根据"Delta像素数改变,而滚动窗口由下面的语句实现:
flVSCC0llPOS+= SDSltS;
SetscrollPos(SB.VERT, In--nvscrollPos, TRUE);
Scrollwindow(0,"Delta);
以上用于垂直滚动条,
*SCCO工IPOS+=SDSltS;
SetscrollPos(SB.HORZ,。nHScrollPos, TRUE);
Scrollwindow("Delta, 0);
以上用于水平滚动条。
存储在。nHScrollPos和 m.nVScrollPOs中的滚动条位置是如何添加到程序输出中的
呢?在调用onPaint绘制滚动操作所揭示的一部分工作空间时,onPaint用下面的语句重置
窗口的原点:
dc.Setwindoworg(In-nHScrollPos,。nvscrollPos);
CDC:: Setwindoworp通知 Windows将逻辑点(x, y)映射为设备点(0,0)。对客户区设备描
述表来说,该点对应窗口客户区的左上角。上面的语句将坐标系原点向左移动rn-nHScrollPos
个像素点,向上移动。nVScrollP0s个像素点。如果onPalnt要把像素点画在(0,0),则GDI将
坐标对显式转化为(-。nHScrollPos,-rn-nVScrollPos)。如果滚动条位置为(0,100),那么程序
输出的前面100行像素会被剪裁下来,而用户可以看见的输出是从第101行开始的。用这种方
法重置原点可以在虚拟显示平面上简捷有效地移动滚动式窗口。
如果能放大窗口直到整个电子表格显示出来,那么你会发现这时滚动条消失了。这是
因为如果窗口尺寸等于或大于虚拟工作空间,则 CMainwindow:: onsize将滚动条范围设为
0。只要窗口尺寸发生变化,Onsize处理程序就会更新滚动参数,使滚动条滑块准确反映窗
口和虚拟工作空间的相对比例。
这样,所有的功能模块都具备了。用户单击滚动条或拖动滚动条滑块,onHScroll或
onVScroll接收消息并相应地更新滑块位置和滚动窗口; Setwindoworg移动绘图原点到当前
滑块位置,onPaint重画窗口。尽管窗口尺寸对程序输出有一些物理限制,但现在整个工作
空间都可以访问了。这只要少于100行附加代码就能做到。还能更容易吗?
这么问很好笑。因为这正是MFC CScrollView类的目的——使滚动实现起来更加容易
些。CScrollView是一个MFC类,封装了滚动式窗口的行为。只要告诉CScrollView需要多大
的视图,其他工作就都由它处理了。另外,CScrollView处理WM_VSCROLL和WM_HSCROLL
消息,滚动窗口以响应滚动条事件,并在窗口尺寸变化时更新滚动条滑块的大小。
尽管将CSc。llView写人一个应用程序(如 AcceD完全有可能,但CScrollView主要用于文
档/视图应用程序。第10章将更详细地讲解CScrollView,并介绍MFC提供的一些其他的视
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -