Отключить форму, поднимающуюся к вершине - PullRequest
4 голосов
/ 26 ноября 2011

Мне нужна форма, которая, когда я устанавливаю в нижней части z-порядка, она остается там. Я попробовал:

SetWindowPos(Handle,HWND_BOTTOM,Left,Top,Width,Height,SWP_NOZORDER);

и когда я перекрываю его с другими приложениями, он остается внизу, как мне нужно. Однако, когда я нажимаю на него, он поднимается наверх. Я тогда попробовал:

SetWindowPos(Handle, HWND_BOTTOM, Left, Top, Width, Height,
             SWP_NOACTIVATE or SWP_NOZORDER);

и другие выключатели с этого сайта ... http://msdn.microsoft.com/en-us/library/ms633545.aspx

Но оно все еще поднимается к вершине.

Ответы [ 3 ]

8 голосов
/ 26 ноября 2011

SetWindowPos устанавливает положение окна, только когда оно вызывается, оно не устанавливает состояние.Обработка WM_WINDOWPOSCHANGING является правильным способом сделать это:

Во время обработки этого сообщения изменение любого из значений в WINDOWPOS влияет на новый размер окна, положение илиместо в Z порядке.Приложение может предотвратить изменения в окне, установив или очистив соответствующие биты в элементе флагов WINDOWPOS.

type
  TForm1 = class(TForm)
    ..
  private
    procedure WindowPosChanging(var Msg: TWMWindowPosMsg);
        message WM_WINDOWPOSCHANGING;
  end;

..

procedure TForm1.WindowPosChanging(var Msg: TWMWindowPosMsg);
begin
  if Msg.WindowPos.flags and SWP_NOZORDER = 0 then
    Msg.WindowPos.hwndInsertAfter := HWND_BOTTOM;
  inherited;
end;
1 голос
/ 26 ноября 2011

Никогда не пробовал, но вы могли бы где-то перехватить сообщение WM_WINDOWPOSCHANGING и перевернуть Z-порядок. Хотя может быть сложно, и я лично нахожу это раздражающе нестандартным.

Лучшим вариантом может быть пункт меню, эквивалентный cacsade, но с сортировкой по z-порядку, я имею в виду, если они нажмут на него, то ожидают его увидеть.

0 голосов
/ 26 ноября 2011

Из-за инстинкта я бы не поверил, что приложение всегда будет работать так, как вы ожидаете.В других приложениях может быть гораздо более строгий метод принудительного представления себя перед вами, или, наоборот, в вашем случае, отправка его обратно.Например, таймер, который многократно отправляет окно назад.Затем, если у вас есть два таких многоуровневых приложения, вы будете наблюдать, как они сражаются друг с другом, в основном, мерцая взад и вперед.В конце концов, я бы не стал рассчитывать на постоянное 100% решение для этого, потому что вы никогда не знаете, что другие приложения могут сделать, чтобы переопределить ваше.

...