Эффекты движения Windows Vista и 7 применяются только один раз, когда отображается моя форма.Зачем? - PullRequest
4 голосов
/ 17 декабря 2010

Я создал приложение с двумя формами.Первый является основной формой, а второй скрыт.Я поместил кнопку на Form1 и сделал ее ShowModal второй формы.На Win7 форма появляется с анимацией.Затем я закрываю появившуюся форму (Form2) и нажимаю кнопку еще раз.Форма 2 появляется без анимации.Я хочу анимацию каждый раз.Что мне делать?

Ответы [ 3 ]

3 голосов
/ 17 декабря 2010

Единственное, о чем я могу думать сейчас, - это создавать форму вручную каждый раз, когда вы хотите отобразить ее модально.Для этого перейдите в настройки проекта и убедитесь, что форма не создается автоматически.Затем выполните

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TForm2.Create(self) do
    try
      ShowModal;
    finally
      Free;
    end;
end;

По моему мнению, чаще всего модальные формы на самом деле должны создаваться вручную.

1 голос
/ 17 декабря 2010

Ну, вы можете просто не беспокоиться об этом!В качестве альтернативы очень быстрым способом взлома было бы освобождение формы каждый раз, когда она закрывается, так как анимация запускается только при первом показе формы.

РЕДАКТИРОВАТЬ: Другой подход заключается в вызове DestroyHandle в вашей форме, когдаэто закрывается.Я догадываюсь сейчас, но я представляю, что Windows записывает где-то в окне флаг, указывающий, что анимация была показана.Когда этот флаг установлен, анимация больше не отображается.

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

В качестве альтернативы можно обмануть окна, отправив уведомление о том, что стиль формы был изменен, что заставит Windows сбросить «секретный флаг» для дескриптора текущей формы. Таким образом, при показе уже созданной формы анимация с эффектом крутого шоу снова будет применена. Однако я не могу сказать, какие негативные последствия могут быть вызваны таким образом.

uses
  Winapi.Windows, Vcl.Controls;

type
  TFormHelper = class helper for TForm
  public
    procedure Show;
  end;

implementation

procedure TFormHelper.Show;
begin
  SendMessage(Handle,CM_CUSTOMSTYLECHANGED,0,0);
  inherited Show;
end;

Примечание : код с функцией помощника по классам, эта функция / ключевое слово может быть недоступна в более старых IDE.

...