SetClassLong
SetClassLong函数将指定的偏移量中指定的32位(长)值替换为指定窗口所属的类的额外类内存或WNDCLASSEX结构。
注意 该函数已被SetClassLongPtr函数取代。 要编写与32位和64位版本的Windows兼容的代码,请使用SetClassLongPtr。
DWORD SetClassLong(
HWND hWnd, // 窗口句柄
int nIndex, // 要改变的值索引
LONG dwNewLong // 新值
);
参数
返回值
如果函数成功,则返回值是指定的32位整数的前一个值。 如果该值以前未设置,则返回值为零。
如果函数失败,返回值为零。 要获得扩展的错误信息,请调用GetLastError。
备注
如果使用SetClassLong函数和GCL_WNDPROC索引来替换窗口过程,则窗口过程必须符合WindowProc回调函数描述中指定的准则。
使用GCL_WNDPROC索引调用SetClassLong将创建窗口类的子类,该子类将影响随后使用该类创建的所有窗口。 应用程序可以继承一个系统类,但不应该继承由另一个进程创建的窗口类。
通过在RegisterClassEx函数使用的WNDCLASSEX结构的cbClsExtra成员中指定一个非零值来保留额外的类内存。
小心使用SetClassLong函数。 例如,可以使用SetClassLong更改类的背景颜色,但此更改不会立即重新绘制属于该类的所有窗口。
Windows 95/98/Me: SetClassLongW由Microsoft层为Unicode支持。 请注意,随后调用此函数将覆盖以前调用的结果,因此您必须保存稍后要使用的任何结果。 要使用此版本,您必须将某些文件添加到您的应用程序中,如Windows 95/98 / Me系统上的Microsoft Layer for Unicode所述。
示例代码
有关示例,请参阅显示图标。
要求
Windows NT/2000/XP: 包含在Windows NT 3.1和更高版本中。
Windows 95/98/Me: 包含在Windows 95和更高版本中。
头文件: 声明于 Winuser.h; 包含于 Windows.h.
库: 使用 User32.lib.
Unicode: 在Windows NT/2000/XP上作为Unicode和ANSI版本实现。 Microsoft层还支持Unicode。
SetCapture
SetCapture函数将鼠标捕获设置为属于当前线程的指定窗口。 当鼠标移动到捕获窗口时,或者当鼠标移动到捕获窗口并且按钮仍然关闭时按下鼠标按钮时,SetCapture捕获鼠标输入。 一次只有一个窗口可以捕捉鼠标。
如果鼠标指针位于另一个线程创建的窗口之上,则只有在鼠标按钮关闭的情况下,系统才会将鼠标指针指向指定的窗口。
HWND SetCapture(
HWND hWnd // 窗口句柄
);
参数
hWnd
[in] 当前捕获鼠标的线程中的窗口句柄。
返回值
返回值是先前捕获鼠标的窗口的句柄。 如果没有这样的窗口,则返回值为NULL。
备注
只有前景窗口才能捕捉鼠标。 当背景窗口尝试这样做时,窗口仅接收鼠标事件的消息,当光标热点位于窗口的可见部分内时发生。 另外,即使前景窗口捕捉到了鼠标,用户仍然可以点击另一个窗口,将其带到前台。
当窗口不再需要全部鼠标输入时,创建该窗口的线程应调用ReleaseCapture函数释放鼠标。
此函数不能用于捕获针对其他进程的鼠标输入。
捕获鼠标时,菜单热键和其他键盘快捷键不起作用。
Windows 95/98/Me: 调用SetCapture会导致失去鼠标捕获的窗口收到WM_CAPTURECHANGED消息。
示例代码
有关示例,请参见使用鼠标绘制线条。
要求
Windows NT/2000/XP: 包含在Windows NT 3.1和更高版本中。
Windows 95/98/Me: 包含在Windows 95和更高版本中。
头文件: 声明于 Winuser.h; 包含于 Windows.h.
库: 使用 User32.lib.
SetActiveWindow
SetActiveWindow函数激活一个窗口。 该窗口必须附加到调用线程的消息队列。
HWND SetActiveWindow(
HWND hWnd // 窗口句柄
);
参数
返回值
如果函数成功,则返回值是先前活动的窗口的句柄。
如果函数失败,返回值为NULL。 要获得扩展的错误信息,请调用GetLastError。
备注
SetActiveWindow函数激活一个窗口,但不是如果应用程序在后台。 当系统激活窗口时,如果窗口的应用程序位于前台,该窗口将被置于前台(Z顺序的顶部)。
如果由hWnd参数标识的窗口是由调用线程创建的,则调用线程的活动窗口状态将设置为hWnd。 否则,调用线程的活动窗口状态将设置为NULL。
通过使用AttachThreadInput函数,线程可以将其输入处理附加到另一个线程。 这允许线程调用SetActiveWindow来激活附加到另一个线程的消息队列的窗口。
要求
Windows NT/2000/XP: 包含在Windows NT 3.1和更高版本中。
Windows 95/98/Me: 包含在Windows 95和更高版本中。
头文件: 声明于 Winuser.h; 包含于 Windows.h.
库: 使用 User32.lib.
ScrollWindowEx
ScrollWindowEx函数滚动指定窗口客户区的内容。
int ScrollWindowEx(
HWND hWnd, // 窗口句柄
int dx, // 水平滚动
int dy, // 垂直滚动
CONST RECT *prcScroll, // 客户区
CONST RECT *prcClip, // 剪切矩形
HRGN hrgnUpdate, // 要更新的区域句柄
LPRECT prcUpdate, // 无效区域
UINT flags // 滚动选项
);
参数
hWnd
[in] 客户区滚动的窗口句柄。
dx
[in] 指定水平滚动的数量(以设备单位表示)。 此参数必须为负值才能滚动到左侧。
dy
[in] 指定垂直滚动的数量(以设备单位表示)。 此参数必须为负值才能向上滚动。
prcScroll
[in] 指向RECT结构的指针,指定要滚动的客户区的部分。 如果此参数为NULL,则会滚动整个客户区。
prcClip
[in] 指向包含剪切矩形坐标的RECT结构的指针。 剪裁矩形内的设备位仅受影响。 从矩形外侧滚动到内侧的位被绘制; 从矩形内部滚动到外部的位不被绘制。 该参数可能为NULL。
hrgnUpdate
[in] 修改后的区域以保持滚动失效的区域句柄。 该参数可能为NULL。
prcUpdate
[out] 指向RECT结构的指针,该结构接收通过滚动无效的矩形的边界。 该参数可能为NULL。
flags
[in] 指定控制滚动的标志。 该参数可以是以下值之一。
值 | 含义 |
---|
SW_ERASE | 当使用SW_INVALIDATE标志指定时,通过向窗口发送WM_ERASEBKGND消息擦除新失效的区域。 |
SW_INVALIDATE | 滚动后,使hrgnUpdate参数标识的区域失效。 |
SW_SCROLLCHILDREN | 滚动与prcScroll参数指向的矩形相交的所有子窗口。 子窗口按dx和dy参数指定的像素数滚动。 系统向所有与prcScroll矩形相交的子窗口发送WM_MOVE消息,即使它们不移动。 |
SW_SMOOTHSCROLL | Windows 98/Me, Windows 2000/XP: 使用平滑滚动滚动。 使用flags参数的HIWORD部分指示平滑滚动操作需要多长时间。 |
返回值
如果函数成功,则返回值为SIMPLEREGION(矩形无效区域),COMPLEXREGION(非矩形无效区域;重叠矩形)或NULLREGION(无效区域)。
如果函数失败,返回值为ERROR。 要获得扩展的错误信息,请调用GetLastError。
备注
如果未指定SW_INVALIDATE和SW_ERASE标志,则ScrollWindowEx不会使从中滚动的区域失效。 如果设置了这些标志中的任何一个,则ScrollWindowEx将使该区域失效。 在应用程序调用UpdateWindow函数,调用RedrawWindow函数(指定RDW_UPDATENOW或RDW_ERASENOW标志)或从应用程序队列中检索WM_PAINT消息之前,该区域不会更新。
如果窗口具有WS_CLIPCHILDREN样式,则由hrgnUpdate和prcUpdate指定的返回区域表示必须更新的滚动窗口的总面积,包括需要更新的子窗口中的任何区域。
如果指定了SW_SCROLLCHILDREN标志,则如果子窗口的一部分被滚动,则系统不会正确更新屏幕。 位于源矩形外部的滚动子窗口的部分未被擦除,并且未在其新目标中正确重绘。 要移动不完全位于由prcScroll指定的矩形内的子窗口,请使用DeferWindowPos函数。 如果设置了SW_SCROLLCHILDREN标志且光标矩形与滚动矩形相交,则光标将重新定位。
无论窗口是否具有CS_OWNDC或CS_CLASSDC类样式,所有输入和输出坐标(对于prcScroll,prcClip,prcUpdate和hrgnUpdate)均被确定为客户端坐标。 如有必要,使用LPtoDP和DPtoLP函数来转换逻辑坐标和从逻辑坐标转换。
示例代码
有关示例,请参阅滚动文本示例。
要求
Windows NT/2000/XP: 包含在Windows NT 3.1和更高版本中。
Windows 95/98/Me: 包含在Windows 95和更高版本中。
头文件: 声明于 Winuser.h; 包含于 Windows.h.
库: 使用 User32.lib.
ScrollWindow
ScrollWindow函数滚动指定窗口客户区的内容。
注意 ScrollWindow函数是为了向后兼容而提供的。 新的应用程序应该使用ScrollWindowEx函数。
BOOL ScrollWindow(
HWND hWnd, // 窗口句柄
int XAmount, // 水平滚动
int YAmount, // 垂直滚动
CONST RECT *lpRect, // 客户区
CONST RECT *lpClipRect // 剪切矩形
);
参数
hWnd
[in] 客户区滚动的窗口句柄。
XAmount
[in] 指定水平滚动的数量(以设备单位表示)。 如果正在滚动的窗口具有CS_OWNDC或CS_CLASSDC样式,则此参数使用逻辑单位而不是设备单位。 此参数必须为负值,才能将窗口的内容向左滚动。
YAmount
[in] 指定垂直滚动的数量(以设备单位表示)。 如果正在滚动的窗口具有CS_OWNDC或CS_CLASSDC样式,则此参数使用逻辑单位而不是设备单位。 该参数必须是一个负值,用于向上滚动窗口的内容。
lpRect
[in] 指向RECT结构的指针指定要滚动的客户区的部分。 如果此参数为NULL,则会滚动整个客户区。
lpClipRect
[in] 指向包含剪切矩形坐标的RECT结构的指针。 剪裁矩形内的设备位仅受影响。 从矩形外侧滚动到内侧的位被绘制; 从矩形内部滚动到外部的位不被绘制。
返回值
如果函数成功,返回值为非零。
如果函数失败,返回值为零。 要获得扩展的错误信息,请调用GetLastError。
备注
如果光标正在滚动的窗口中,ScrollWindow将自动隐藏脱字符以防止它被擦除,然后在滚动完成后恢复脱字符。 插入位置相应地进行调整。
ScrollWindow未覆盖的区域未被重新绘制,但它被合并到窗口的更新区域中。 应用程序最终会收到一条WM_PAINT消息,通知它该区域必须重新绘制。 要在滚动操作的同时重新绘制未覆盖区域,请在调用ScrollWindow后立即调用UpdateWindow函数。
如果lpRect参数为NULL,则窗口中任何子窗口的位置将偏移XAmount和YAmount参数指定的量; 窗口中的无效(未绘制)区域也被抵消。 当lpRect为NULL时,ScrollWindow更快。
如果lpRect不为NULL,则子窗口的位置不会更改,并且窗口中的无效区域不会被偏移。 为了防止在lpRect不为NULL时更新问题,请在调用ScrollWindow之前调用UpdateWindow重新绘制窗口。
示例代码
有关示例,请参阅滚动文本示例。
要求
Windows NT/2000/XP: 包含在Windows NT 3.1和更高版本中。
Windows 95/98/Me: 包含在Windows 95和更高版本中。
头文件: 声明于 Winuser.h; 包含于 Windows.h.
库: 使用 User32.lib.