c++ - significa - mfc windows 10
Cancelar una DeferWindowPos (2)
La única referencia a cualquier tipo de funcionalidad de "abortar" que veo es la siguiente:
Si alguna de las ventanas en la estructura de posición de ventana múltiple tiene el indicador SWP_HIDEWINDOW o SWP_SHOWWINDOW marcado, ninguna de las ventanas se reposiciona.
Esto viene de aquí .
Estoy haciendo una serie de cambio de tamaño de ventana usando la funcionalidad DeferWindowPos. Supongamos que ya abrí el manejador DeferWindowPos, y llamé a DeferWindowPos por un tiempo, y ahora quiero cancelar todo: no llamar a EndDeferWindowPos. Intenté CloseHandle (hDWP), pero no funciona (crash). Si simplemente regreso de mi función, supongo que perderá un identificador. ¿Es posible terminar el DeferWindowPos sin llamar a EndDeferWindowPos?
// 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 );
Si esto no es posible, simplemente los acumularé en un vector temporal, y llamaré al asunto Diferir al final, cuando estoy seguro de querer hacerlos todos.
"Si esto no es posible, simplemente los acumularé en un vector temporal, y llamaré al asunto Diferir al final, cuando estoy seguro de que quiero hacerlos todos".
Esta sería la solución correcta. ¿Cuál es su argumento para estar indeciso sobre qué ventanas reposicionar entre BeginDeferWindowPos
, DeferWindowPos
y EndDeferWindowPos
? Esto parece relacionarse más con un problema de enhebrado que puede resolver usando el bloqueo apropiado.
La respuesta de Arkadiy no "cancela" nada. Por lo que entiendo la documentación de Win32 , simplemente no puede combinar las operaciones mostrar / ocultar, con operaciones de reposicionamiento . En otras palabras, no cancela la operación , las operaciones mostrar / ocultar simplemente tienen prioridad y esas son las que se ejecutarán.
Encapsulé mostrar / ocultar y reposicionar en una biblioteca administrada: Extensión de biblioteca de clase de marco .
La función RepositionWindows RepositionWindows()
específica se encuentra en Whathecode.System.Windows.WindowManager y se encarga de mostrar / ocultar y reposicionar.
/// <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 );
}