set_window_long

Function set_window_long 

Source
pub fn set_window_long(
    h_wnd: HWND,
    n_index: WINDOW_LONG_PTR_INDEX,
    new_long: i32,
) -> i32
Expand description

更改指定窗口的属性。函数还将指定偏移量的 32 位 (长整型) 值设置为额外的窗口内存。 注意 此函数已被 set_window_long_ptr 函数取代。若要编写与 32 位和 64 位版本的 Windows 兼容的代码,请使用 set_window_long_ptr 函数。 如果函数成功,则返回值是指定 32 位整数的上一个值。 如果函数失败,则返回值为零。要获得更多的错误信息,请调用 get_last_error。 如果指定的 32 位整数的上一个值为零,并且函数成功,则返回值为零,但函数不会清除最后一个错误信息。这使得很难确定成功或失败。若要处理此问题,在调用 set_window_long 之前,应通过调用 set_last_error 0 来清除最后一个错误信息。然后,函数失败将由返回值零和 get_last_error 结果指示为非零。 某些窗口数据会缓存,因此在调用 set_window_pos 函数之前,使用 set_window_long 所做的更改不会生效。具体而言,如果更改任何框架样式,则必须使用 SWP_FRAMECHANGED 标志调用 set_window_pos,以便正确更新缓存。 如果将 set_window_long 与 GWL_WNDPROC 索引一起使用来替换窗口过程,则窗口过程必须符合 WindowProc 回调函数的说明中指定的准则。 如果将 set_window_long 与 DWL_MSGRESULT 索引一起使用来设置对话过程处理的消息的返回值,则应在之后直接返回 TRUE 。否则,如果调用导致对话过程接收窗口消息的任何函数,嵌套窗口消息可能会覆盖使用 DWL_MSGRESULT 设置的返回值。 使用GWL_WNDPROC索引调用 set_window_long 会创建用于创建窗口的窗口类的子类。应用程序可以子类化系统类,但不应子类化由另一个进程创建的窗口类。set_window_long 函数通过更改与特定窗口类关联的窗口过程来创建窗口子类,导致系统调用新窗口过程而不是上一个窗口过程。应用程序必须通过调用 call_window_proc 将新窗口过程未处理的任何消息传递到上一个窗口过程。这允许应用程序创建窗口过程链。 通过在 与 register_class_ex 函数一起使用的 WNDCLASSEX 结构的 cbWndExtra 成员中指定非零值来保留额外的窗口内存。 不得使用 GWL_HWNDPARENT 索引调用 set_window_long 来更改子窗口的父窗口。请改用 set_parent 函数。 如果窗口的类样式 为CS_CLASSDC 或 CS_OWNDC,请不要将扩展窗口样式设置为 WS_EX_COMPOSITED 或 WS_EX_LAYERED。 调用 set_window_long 以在进度栏上设置样式将重置其位置。 h_wnd 窗口的句柄,以及窗口所属类的间接句柄。 n_index 要设置的值的从零开始的偏移量。有效值在零到额外窗口内存的字节数之间,减去整数的大小。若要设置任何其他值,请指定以下值之一。 值 | 含义 GWL_EXSTYLE -20 | 设置新的 扩展窗口样式。 GWL_HINSTANCE -6 | 设置新的应用程序实例句柄。 GWL_ID -12 | 设置子窗口的新标识符。 该窗口不能是顶级窗口。 GWL_STYLE -16 | 设置新 窗口样式。 GWL_USERDATA -21 | 设置与窗口关联的用户数据。 此数据供创建窗口的应用程序使用。 其值最初为零。 GWL_WNDPROC -4 | 为窗口过程设置新地址。 如果窗口不属于调用线程所在的进程,则无法更改此属性。当 hWnd 参数标识对话框时,以下值也可用。 值 | 含义 DWL_DLGPROC DWLP_MSGRESULT + sizeof (LRESULT) | 设置对话框过程的新地址。 DWL_MSGRESULT 0 | 设置对话框过程中处理的消息的返回值。 DWL_USER DWLP_DLGPROC + sizeof (DLGPROC) | 设置应用程序专用的新额外信息,例如句柄或指针。 new_long 替换值。