2013-04-28 64 views
3

是什么表示一个窗口的下列方法之间的差别:的ShowWindow VS SWP_SHOWWINDOW VS WS_VISIBLE

  • ShowWindow功能。
  • The SetWindowPos功能与SWP_SHOWWINDOW标志。
  • WS_VISIBLESetWindowLong功能加入到GWL_STYLE

还有其他方法吗?

+0

你想达到什么目的? – 2013-04-28 11:46:07

+0

我需要编写一个监视其他程序活动的程序,并且我需要知道何时显示一个窗口。我想通过API挂钩实现它,但现在我正在考虑使用消息挂钩并监视WM_WINDOWPOSCHANGED消息。 您是否知道窗口在显示时是否总是收到WM_WINDOWPOSCHANGED消息? – Ben 2013-04-28 15:20:33

+0

你为什么不问这个问题?这就是你想知道的。直接询问。是的,窗户在可见性发生变化时会收到通知。 – 2013-04-28 15:28:23

回答

4

我认为他们大多是相同的,但对于每一个附加的功能:

  1. SetWindowLongWS_VISIBLE加入GWL_STYLE是proably最无趣:为什么惹样式位,如果有一个功能,正是你所需要的。
  2. SetWindowPosSWP_SHOWWINDOW允许您通过单个原子操作同时显示窗口并设置其位置和大小,以便没有人 - 程序或用户 - 可以看到可见不移动或移动不可见的窗口。
  3. ShowWindow函数有很多魔法,尤其是第一次在程序中调用。另外,它具有SW_SHOWDEFAULT标志,它很少使用,但不适用于任何其他方法AFAIK。

还有其他方法可以使窗口可见。从头到尾:

  1. 使用WS_VISIBLE标志设置创建它。
  2. DeferWindowPosSetWindowPos具有相同的标志。
1

SetWindowLong函数设置初始窗口样式,即如果窗口在创建后立即显示或不显示。 MSDN表示在窗口创建之后,您必须使用其他两个函数来设置可见属性。一个典型的应用是:

case WM_CREATE: 
{ 
    long style = GetWindowLong(hWnd, GWL_STYLE); 
    SetWindowLong(hWnd, GWL_STYLE, style | WS_DLGFRAME); 

    return 0; 
} 

ShowWindowSetWindowPos有关于可视窗口的重叠功能。如果您必须在设置其可见性的同时将窗口沿x,y或z方向移动,请使用SetWindowPos。我个人发现需要指定必要的uFlags参数使得此功能使用起来有点麻烦,但MSDN是您的朋友;-)

如果另一方面您不需要窗口移动,但即将最大化,最小化,还原等,使用ShowWindow。由于它只将窗口句柄和nCmdShow常量作为参数,因此它是一个易于使用的函数。

相关问题