关于ScrollWindow()和UpdateWindow()

windows程序设计第4章,加滚动条。

水平或垂直滚动消息处理中,会有如下两句代码:

ScrollWindow(hwnd, 0, (iVertPos - si.nPos)*cyChar, NULL, NULL);
UpdateWindow(hwnd);

其中ScrollWIndow()使视图向上滚动(iVertPos - si.nPos)*cyChar个像素单位,将新出现的区域无效化。也即,若消息是SB_LINEDOWM,则只有视图区的最下面,一行字符所占区域为无效区,而除该区域以处,全是有效区,不用重绘。

ScrollWIndow()这个平移功能好强大啊。

关键在这里了:UpdateWIndow()函数,书上写的是发送一条非队列消息WM_PAINT,但事实是,这个函数根本不会引发消息哎。这只是把队列中已经有的重绘消息提出来,放到队列最前面而已。所以,即使用了这行代码,重绘区,即PAINTSTRUCT的参数也不会变,还是滚动新出现的区域,而绝非全部整个视图。


实验:

在重绘的消息处理区for循环之前加上如下两句代码:

wsprintf(szBuffer, TEXT("%5d"), ps.rcPaint.top);
MessageBox(hwnd, szBuffer, TEXT("what"), MB_OK);

然后,运行。调整滚动条,看消息框中的数值。



`ScrollWindow`和`ScrollWindowEx`函数Windows API中的函数,用于在指定的窗口内滚动矩形区域的内容。而`ScrollDC`是与设备上下文(Device Context,简称DC)相关的一个函数,用于滚动指定设备上下文的内容。它们的具体区别和用法如下: 1. `ScrollWindow` 和 `ScrollWindowEx` 函数: - `ScrollWindow`函数将一个窗口客户区的一部分向上或向左滚动指定的像素数。这个函数在指定的矩形内进行滚动操作,并可以选择是否将滚动区域内的内容重绘到窗口的其他部分。 - `ScrollWindowEx`是`ScrollWindow`的扩展版本,提供了更多的控制选项。它允许更复杂的滚动操作,例如,可以指定滚动的起点,可以控制重绘行为,还可以指定更新区域,以便在滚动过程中只重绘必要的部分。 用法示例: ```cpp // 假设有一个窗口句柄 hWind int nXAmount = 10; // 水平滚动距离 int nYAmount = 10; // 垂直滚动距离 HRGN hrgnUpdate = CreateRectRgn(0, 0, 0, 0); // 创建一个空的区域句柄用于重绘 BOOL bRedraw = TRUE; // 是否重绘窗口 ScrollWindowEx(hWind, nXAmount, nYAmount, NULL, NULL, NULL, NULL, SW_INVALIDATE | SW_ERASE | SW_SCROLL); ScrollWindow(hWind, nXAmount, nYAmount, NULL, NULL, hrgnUpdate, bRedraw); ``` 2. `ScrollDC`函数: - `ScrollDC`函数用于滚动设备上下文的内容。它与`ScrollWindow`系列函数的区别在于,它不直接与窗口客户区关联,而是直接作用于设备上下文对象。这对于在非客户区或直接操作像素数据时非常有用。 用法示例: ```cpp // 假设有一个设备上下文句柄 hDC int nXAmount = 10; // 水平滚动距离 int nYAmount = 10; // 垂直滚动距离 ScrollDC(hDC, nXAmount, nYAmount, NULL, NULL, NULL, NULL); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值