Отменить DeferWindowPos - PullRequest
       7

Отменить DeferWindowPos

5 голосов
/ 30 января 2009

Я делаю серию изменения размера окна с использованием функциональности DeferWindowPos. Предположим, я уже открыл дескриптор DeferWindowPos и ​​несколько раз вызвал DeferWindowPos, и теперь я хочу отменить все: не вызывать EndDeferWindowPos. Я пробовал CloseHandle (hDWP), но он не работает (сбой). Если я просто вернусь из своей функции, я предполагаю, что она утечет ручкой. Можно завершить DeferWindowPos без вызова 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 );

Если это невозможно, я просто накапливаю их во временном векторе и в конце вызываю материал Defer, когда я уверен, что хочу сделать их все.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2014

«Если это невозможно, я просто накапливаю их во временном векторе и в конце вызываю материал Defer, когда я уверен, что хочу сделать их все».

Это было бы правильным решением. Каков ваш аргумент в пользу нерешительности относительно того, какие окна следует перемещать между BeginDeferWindowPos, DeferWindowPos и EndDeferWindowPos? Похоже, это больше относится к проблеме многопоточности, которую вы можете решить, используя соответствующую блокировку.

Arkadiy ответ не отменяет ничего. Насколько я понимаю документация Win32 , , вы просто не можете объединить операции показа / скрытия с операциями изменения положения . Другими словами, вы не отменяете операцию , операции show / hide просто имеют приоритет, и именно они будут выполняться.

Я инкапсулировал отображение / скрытие и изменение положения в управляемой библиотеке: Расширение библиотеки классов Framework .

Специальная функция 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 );
}
0 голосов
/ 30 января 2009

Единственная ссылка на какую-либо функцию «прерывания», которую я вижу, это:

Если любое из окон в структура с несколькими окнами иметь SWP_HIDEWINDOW или Флаг SWP_SHOWWINDOW установлен, ни один из окна переставлены.

Это исходит от здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...