更新时间:2024-06-10 11:17
int ScrollWindowEx(
HWND hWnd, // handle to window
int dx, // horizontal scrolling
int dy, // vertical scrolling
CONST RECT *prcScroll, // client area
CONST RECT *prcClip, // clipping rectangle
HRGN hrgnUpdate, // handle to update region
LPRECT prcUpdate, // invalidated region
UINT flags // scrolling options
);
hWnd:客户区域将被滚动的窗体句柄。
dx:在设备单元中,指定水平滚动数量。在向左滚动时此参数必须为负。
dy:在设备单元中,指定垂直滚动数量。在向上滚动时此参数必须为负。
prcScroll:指向RECT结构,它指定了将被滚动的客户区域部分。
prcClip:指向包含了类似于被剪下矩形的RECT结构。只有在剪下内部的小块图形才受影响。从矩形外向内部的滚动部分将被着色;而从内向外的滚动部分将不再被着色。
hrgnUpdate:处理已被修改的区域,保存这些由于滚动而无效的区域。此参数可以为空。
prcUpdate:指向RECT结构,它接收由于滚动使得矩形无效部分的边界。此参数值可以为空。
flags:指定控制滚动的标志。这个参数可以是下面的值:
SW_ERASE:通过发送WM_ERASEBKGND消息给窗体。
SW_INVALIDATE:在滚动后,使得由参数hrgnUpdate标识的无效区域被擦除。
SW_SCROLLCHILDREN:动所有由参数prcScroll指出交叉重叠矩形的子窗体。子窗体按照dx和dy规定的像素个数滚动。系统发送消息给所有由prcScroll指出交叉重叠矩形的子窗体,即使他们不移动。
返回值:如果函数运行成功,返回值为SIMPLEREGION(矩形的无效区域),COMPLEXREGION(非矩形的无效区域)或NULLREGION(没有使无效的区域)如果函数运行失败,返回值为ERROR。若想获得更多的错误信息,请调用GetLastError函数。
注意:如果SW_INVALIDATE和SW_ERASE标志没有被设定,那么函数ScrollWindowEx不能使滚动离开的区域失效。如果其中任意一个标志被设置,ScrollWindowEx函数就可以使区域无效。这块区域将不再被更新直到应用程序调用theUpdateWindow函数,调用theRedrawWindow函数(指定RDW_UPDATENOW或RDW_ERASENOW标志)或是从申请队列中找到WM_PAINT消息。
如果窗体拥有WS_CLIPCHILDREN类型,那么由hrgnUpdate和prcUpdate指定的返回区域描述了必须更新的滚动窗体的全部区域,包括所需更新子窗体的任何区域。
若SW_SCROLLCHILDREN标志被设置,在子窗体被滚动时,系统将不能完全更新屏幕。位于矩形外边的滚动子窗体部分不被擦除,也不在它的新方向上被重画。为了移动子窗体使之完全不在prcScroll指定的矩形条中,可使用DeferWindowPos函数。若标志SW_SCROLLCHILDREN被设置并且^符号交叉滚动矩形,则光标也重新设置。
所有输入输出均被定义为客户端如果有必要,使用IptoDP和dptoLP函数转换逻辑相关性。
Windows CE:参数flags不支持SW_SCROLLCHILDREN。参数dx和dy中只有一个为零。
速查:Windows NT 3.1、Windows 95、Windows CE 1.0以上,头文件:winuser.h;库文件:user32.lib。
WindowEx和DC
a)两者都可以将某区域滚动到另外一区域,同时计算脏区域。
b)两者最终的实现都是通过内部的BitBlt实现的。
c)如果要对重绘的区域进行精细的管理和计算,则传入hrfgUpdate,否则传入prcUpdate即可。
a)ScrollDC只是用于DC,因此它不会发出WM_PAINT进行重绘;而ScrollWindowEx则会。另外就是ScrollWindowEx还可以在滚动时进行其他控制,见flags的值。
b)如果需要滚动整个客户区,则需要用到ScrollWindowEx(来自MSDN),个人觉得ScrollDC也可以实现。