取消一个DeferWindowPos

我正在做一系列使用DeferWindowPosfunction的窗口大小调整。 假设我已经打开了DeferWindowPos句柄,并调用了DeferWindowPos几次,现在我想取消所有的事情:不要调用EndDeferWindowPos。 我试过CloseHandle(hDWP),但它不工作(崩溃)。 如果我只是从我的函数返回,我认为它会泄漏一个句柄。 可以在不调用EndDeferWindowPos的情况下终止DeferWindowPos?

// Initialize HDWP hDWP = BeginDeferWindowPos( ... ) for( ... ) { // Calculate new rectangle CRect dcNew; ... // Oh,now I want to return from my function, I want to cancel everything // Accumulate hDWP = DeferWindowPos( hDWP, hWnd, 0, rcNew.left, rcNew.top, rcNew.Width(), rcNew.Height(), SWP_NOZORDER ); } // Finally BOOL bResult = EndDeferWindowPos( hDWP ); 

如果这是不可能的,我会简单地将它们累积在一个临时向量中,并在最后的时候调用推迟的东西,当我确定我想要完成它们的时候。

我看到的任何一种“中止”功能的唯一参考是这样的:

如果多窗口位置结构中的任何窗口都设置了SWP_HIDEWINDOW或SWP_SHOWWINDOW标志,则不会重新定位这些窗口。

这是从这里来的 。

“如果这是不可能的,我会简单地将它们累积在一个临时向量中,并在最后调用推迟的东西,当我确定我想要完成它们时。

这将是正确的解决方案。 你对什么样的窗口在BeginDeferWindowPosDeferWindowPosEndDeferWindowPos之间重新定位DeferWindowPos EndDeferWindowPos ? 这似乎更涉及一个线程问题,您可以使用适当的锁定解决。

Arkadiy的回答并不能“取消”任何事情。 据我所知的Win32文档 , 你不能结合显示/隐藏操作,重新定位操作 。 换句话说, 你不会取消操作 ,显示/隐藏操作只是优先,而那些将被执行。

我封装显示/隐藏和重新放置在托管库: 框架类库扩展 。

具体的RepositionWindows()函数位于Whathecode.System.Windows.WindowManager中 ,它负责显示/隐藏和重新定位。

 /// <summary> /// Reposition a set of windows in one operation. /// TODO: Handle any scenarios where repositioning windows fails. /// </summary> /// <param name="toPosition">The windows to reposition.</param> /// <param name="changeZOrder"> /// When true, the windows's Z orders are changed to reflect the order of the toPosition list. /// The first item in the list will appear at the top, while the last item will appear at the bottom. /// </param> public static void RepositionWindows( List<RepositionWindowInfo> toPosition, bool changeZOrder = false ) { bool changeVisibility = toPosition.Any( w => w.HasVisibilityChanged() ); if ( changeVisibility ) { RepositionWindows( toPosition, false, true ); } RepositionWindows( toPosition, changeZOrder, false ); }