一、POPUP窗口可以显示在屏幕任何地方,它们一般没有父窗口,但是如果明确调用SetParent,这类窗口也可以有父窗口。
[DllImport("user32.dll", EntryPoint = "SetParent")]
public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
这样设置之后,popup窗口会做为子窗口嵌入进父窗口内。从效果上来看,几乎不再有Popup的特性(如:触及屏幕边界时,也不会保持在屏幕中显示的状态)。
二、POPUP窗口也可以设置所有者窗口(owner),这时的POPUP窗口会保持其特有的属性。同是也会跟随其所有者窗口的Z序显示。
[DllImport("user32.dll", SetLastError = true)]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
WindowInteropHelper helper = new WindowInteropHelper(this.hostWindow);
SetWindowLong(nowHwnd, -8, helper.Handle.ToInt32());
因为POPUP的默认属性是Topmost的,如果因为需要将其设置为非Topmost的状态,则很容易出现popup窗口被其它窗口遮挡的问题。原因就是因为popup窗口并没有所有者窗口,这时,其Z序很容易被其它窗口压到底下。如果在设置非Topmost 属性的同时,设置其所有者窗口,则可以解决这样的问题。