Элементы управления сверху, как у TPanel?

Моя программа выполняет трудоемкую задачу, и я хотел бы отобразить TImage в середине окна приложения, но он не останется сверху — мой VST всегда сверху. Однако, когда я использую TPanel, он остается сверху? Как я могу заставить свой TImage сделать это?

На самом деле, решение, применимое ко всем элементам управления, было бы великолепным :)

Спасибо!


person Jeff    schedule 20.03.2011    source источник
comment
@LachlanG: Virtual StringTree, очень известный сторонний элемент управления.   -  person Andreas Rejbrand    schedule 20.03.2011
comment
Спасибо, Андреас. Я знаю управление, должен был угадать аббревиатуру.   -  person LachlanG    schedule 20.03.2011


Ответы (2)


Вам нужен оконный элемент управления (то есть элемент управления с дескриптором окна или "правильный" элемент управления) для отображения сообщения, поскольку неоконный элемент управления не может быть виден над оконным элементом управления. Самое простое решение — поместить TImage в TPanel и установить Image1.Align := alClient и Panel1.BorderStyle := bsNone.

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

procedure TForm1.Button1Click(Sender: TObject);
var
  bm: TBitmap;
  png: TPngImage;
begin
  // The form contains a hidden TPanel (somewhere on the form)
  // with a TImage (alClient).

  // png is a PNG image with an alpha channel
  png := TPngImage.Create;
  try
    png.LoadFromFile('C:\Users\Andreas Rejbrand\Pictures\alpha.png');
    // Create bitmap of form and blend PNG on it
    bm := GetFormImage;
    try
      bm.Canvas.Draw(0, 0, png);
      Image1.Picture.Bitmap := bm;
    finally
      bm.Free;
    end;
    Panel1.Align := alClient;
    Panel1.BringToFront;
    Panel1.Show;
  finally
    png.Free;
  end;
end;

Пример результата

person Andreas Rejbrand    schedule 20.03.2011
comment
Я тоже об этом думал, однако у моего изображения границы альфа-смешения. +1 за информацию, однако! - person Jeff; 20.03.2011
comment
@Andreas Можете ли вы сказать Джеффу, как сделать его панель прозрачной? - person David Heffernan; 20.03.2011
comment
@David: Боюсь ли я, что не знаю надежного метода достижения этого. (Думаю, вы бы добавили WS_EX_TRANSPARENT и ответили на некоторые сообщения.) Пожалуйста, просветите нас, если да. - person Andreas Rejbrand; 20.03.2011
comment
@Андреас, да, это тоже не моя область знаний - person David Heffernan; 20.03.2011
comment
@David: я добавил фрагмент кода, который, по крайней мере, означает то же самое. И этот код абсолютно надежен. - person Andreas Rejbrand; 20.03.2011
comment
TPanel уже прозрачен, когда темы включены, а для параметра «ParentBackground» установлено значение «Истина» (по умолчанию), не так ли? - person Sertac Akyuz; 20.03.2011
comment
@Sertac: создайте новую форму VCL и добавьте вокруг нее десять элементов управления TEdit. Теперь поместите TPanel в форму и позвольте ей покрыть большую часть правок. Запустите проект. Теперь вы не видите правок за панелью. Таким образом, в в этом смысле он не прозрачен. - person Andreas Rejbrand; 20.03.2011
comment
@Andreas - Дело в том, что я хочу использовать свое изображение как своего рода панель, потому что я буду хранить на нем метку, которая отображает сообщение. Возможно ли это с кодом, который вы предоставили? :) - person Jeff; 21.03.2011
comment
Пока панель находится впереди, вы не можете использовать мышь для взаимодействия с другими элементами управления, не так ли? Эффект, который вы демонстрируете, чисто визуальный, верно? Это, вероятно, подходит для Джеффа, когда он хочет эффективно отключить доступ к другим элементам управления, пока активна трудоемкая операция, но не подходит для простого общего отображения изображения перед другими элементами управления. - person Rob Kennedy; 21.09.2013
comment
@Rob: Верно, конечно. IIRC, другие ответы (возможно, даже я сам) делают то, о чем вы говорите. Многослойные окна и тому подобное. - person Andreas Rejbrand; 21.09.2013

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

Добавьте панель и поместите изображение внутрь панели, т.е. родителем изображения является панель. Затем вы можете вывести изображение на передний план, переместив панель на передний план.

Вы думали о том, чтобы скрыть свой VST?

person David Heffernan    schedule 20.03.2011
comment
Да, но я бы предпочел, чтобы это было видно. - person Jeff; 20.03.2011