批量更新组件大小位置信息,BeginDeferWindowPos -- DeferWindowPos -- EndDeferWindowPos

 

BeginDeferWindowPos

  函数功能:该函数为一个多窗口位置结构分配内存并且返回该结构的句柄。
  函数原型:HDWP BeginDeferWindowPos(int nNumWindows);
  参数:
  nNumWindows:指示存储位置信息的初始窗口数目。如有必要,DeferWindowPos函数可以增加该结构的大小。
  返回值:如果函数成功,返回多窗口位置结构。如果分配内存时内存不足,则返回值为NULL。若想获得更多的错误信息,请调用GetLastError函数。
  备注:多窗口位置结构是一个内部结构,应用程序不能直接引用。
  DeferWindowPos函数在多窗口位置结构中填充了将被移动的一个或多个窗口的目标位置信息。EndDeferWindowPos接收该结构的句柄,并且依据存储在该结构中的信息重定位这些窗口。
  如果在多窗口位置结构中的任意一个窗口中设置了SWP_HIDEWINDOW和SWP_SHOWWINDOW标志,则所有窗口都不能被重定位。
  如果系统必须增加在多窗口位置结构中由nNumWindows设置的初始窗口数目,但又没有足够的内存分配,则系统的整个窗口重定位顺序失败(BeginDeferWindowsPos,DeferWindowsPos,EndDeferWindowPos)。应用程序通过指定所需最大数目,可以在执行过程中进行早期的检测和处理。
  速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:不支持:头文件:winuser.h;库文件:user32.lib。

DeferWindowPos

  函数功能:该函数为指定的窗口更新指定的多窗口位置结构,然后函数返回该更新结构的句柄。EndDeferWindowPos函数使用该结构内的信息同时改变一些窗口的位置和大小。该结构由BeginDeferWindowPos函数创建。
  函数原型:HWND DeferWindowPos(HDWP hWinPoslnfo,HWND hWnd,HWND hWndlnsertAffer, int x,int y, int cx, int Cy,UNIT uFags);
  参数:
  hWinPoslnfo:多窗口定位结构的句柄,该结构包含着一个或多个窗口的尺寸和定位信息,可以由函数BeginDeterWindowPos返回该结构或是由最近一次调用的DeferWindowPos函数返回。
  hWnd:窗口的句柄,该窗口的更新信息存储在结构中。
  hWndlnsertAfter:被定位窗口的Z序的前一窗口的句柄。这个参数必须为窗口句柄或下列值之一:HWND_BOTTOM:将窗口定位在Z序的底部。如果hWnd参数指定的是一个最顶层窗口,则该窗口将失去顶级位置而被排在所有其他窗口的底部。
  HWND_NOTOPMOST:将窗口放置在所有顶层窗口的顶部(即在所有顶层窗口的后面)。如果窗口已经是一个非顶层窗口则此参数不起作用。
  HWND_TOP:将窗口放置在Z序的顶部。
  HWND_TOPMOST:将窗口放置在所有非顶层窗口的顶部、即使未被激活,窗口仍保持顶级位置。如果在uFlagS参数中指定了SWP_NOZORDER标志则本参数将被忽略。
  x:指定窗口左上角的X坐标。
  y:指定窗口左上角的y坐标。
  cx:以像素定义窗口的新的宽度。
  cy:以像素定义窗口的新的宽度。
  uelage:指定下列影响窗口的大小和位置的值的组合:
  SWP_DRAWFRAME:在窗口周围画一个边框(该边框定义在窗口类的描述中)。
  SWP_FRAMECHANGED:给窗口发送一个WM_NCCALCSIZE消息,即使窗口的尺寸不作改变也要发送。如果未指定这个标志,则只有窗口大小 改变时才发送WM_NCCALCSIZE消息。
  SWP_HIDEWINDOW:隐藏窗口。
  SWP_NOACTIVATE:不激活窗口。如果未指定这个标志,则窗口被激活并且根据hWndlnsertAfter参数的设置移到或是顶部窗口的顶部或是非顶部窗口的顶部。
  SWP_NOMOVE;维持当前位置(忽略X和y参数)。
  SWP_NOOWNERZORDER:不改变所有者窗口在Z序中的位置。
  SWP_NOREDRAM:不作窗口更新。如果设定了这个标志,则不发生任何窗口刷新的动作。包括不对客户区,非客户区(包括标题条和滚动条),以及由于窗口移动露出的部分父窗口进行刷新。当设定了这个标志时,应用程序一定要明确指出将原窗口清除并且重画窗口的任何部分以及父窗口需要重画的部分。
  SWP_NOREPOSITION:同 SWP_NOOWNERZORDER标志。
  SWP_NOSENDCHANGING:防止窗口接受到WM_WINDOWPOSCHANGING消息。
  SWP_NOSIZE;保持当前大小。(即忽略CX,Xy参数)。
  SWP_NOZORDER:保持当前Z序(忽略hWndlnsertAfter参数)。
  SWP_SHOWWINDOW:显示窗口。
  返回值:返回值指明了被更新的多窗口定位结构。函数返回的句柄可能与传递给函数的句柄不同。这个函数返回的新句柄应在下一次调用时传递给DeferWindowPos函数和EndDeferWindowPos函数。如果调用函数时系统资源不足,则函数返回NULL。若想获得更多错误信息,请调用GetLastError函数。
  备注:如果调用函数DeferWindowPos失败,应用程序应放弃窗口定位动作,并且不再调用EndDeferWindowPos 函数。如果未指定SWP_NOZORDER,系统将由hWnd参数指定的窗口定位于在hWndlnsertAfer参数指定的窗口之后的位置。如果hWndlnsertAfsr参数为空或为HWND_TOP,则系统将窗口放置在Z序顶端。如果hWndlnsertAfer设为HWND_BOTTOM则系统将窗口放置在Z序的底部。
  所有子窗口的坐标都是相对于父窗口客户区的左上角的坐标。
  一个窗口可以通过两种方式设为顶部窗口:或是设hWndlnsertAfter为HWND_TOPMOST并确保未设置SWP_NOZORDER标志;或是设置窗口在Z序中的位置使其在所有已存在的顶端窗口的顶部。当一个非顶端窗口被设为顶端窗口时,则属于它的窗口均被置为顶端窗口,而其所有者则不变。
  如果SWP_NOACTIVATE或SWP_NOZORDER均未设置(即当应用程序要求在窗口被激活的同时改变其z序时),hwdfnsertPos参数只在下列情况中使用:
  在hWndlnsertAfter参数中既未设定HWND_TOPMOST也未设定HWND_NoTTOPMOST标志; 由hWnd指定的窗口不是激活窗口;
  应用程序在将窗口设为活动窗口时应将窗口设置到Z序的顶部。应用程序可以不受任何限制地改变被激活窗口在Z序中的位置,或在激活一个窗口之后将该窗口移到顶端窗口或非顶端窗口的顶部。
  如果一个顶端窗口被重定位到Z序的底部(HWND_BOTTOM)或任何非顶端窗口后面时将不再是顶端窗口。
  一个非顶端窗口可能拥有一个顶端窗口,反之则不成立。从属的任何窗口(例如一个对话框)都设置为顶层窗口以确保所有的从属窗口都在其所有者之上。
  速查: Windows NT:3.1以上版本;Windows:95以上版本; Windows CE:不支持;头文件: winuser.h;库文件:user32.lib。

EndDeferWindowPos

  函数功能:该函数在一个单一的屏幕刷新周期内同时更新一个或多个窗口的位置和大小。
  函数原型:BOOL EndDeferWindowPos( HWND hWinPoslnfo);
  参数;
  hWlnPoslnfo:指向多窗口定位结构的句柄,该结构包含着一个或多个窗口的尺寸和定位信息。这个内部结构由BeginDeferWindowPos函数返回或由最近一次调用DeferWindowPos函数退回。
  返回值:如果函数成功,返回值为非零:如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。
  备注;EndDeferWindowPos函数向内部结构指定的每一个窗口发送WM_WINDOWPOSCHANGING和WM_WINDOWPOSCHANGED消息。
  速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:不支持:头文件:winuser.h;库文件:user32.lib。

你可能感兴趣的