Я сделал производную TForm, которая действует как выпадающая часть комбо, или окно подсказки, или всплывающее меню - временная вещь. У него нет заголовка - его BorderStyle установлен в bsNone. Форма отображается немодально с помощью команды Show, установив ее положение.
Чтобы выделить его, ему нужна тень на границе. Однако следствием установки его границы на bsNone является то, что тень исчезает.
Различные источники Google предлагают варианты этого:
procedure TdlgEditServiceTask.CreateParams(var Params: TCreateParams);
const
CS_DROPSHADOW = $00020000;
begin
inherited;
{ Enable drop shadow effect on Windows XP and later }
if (Win32Platform = VER_PLATFORM_WIN32_NT) and
((Win32MajorVersion > 5) or
((Win32MajorVersion = 5) and (Win32MinorVersion >= 1))) then
Params.WindowClass.Style := Params.WindowClass.Style or
CS_DROPSHADOW;
end;
но это не работает - тень не отображается (если только я не установил границу с изменяемым размером с набором WS_THICKFRAME, который выглядит ужасно ). Это всплывающее окно, а не дочернее окно, поэтому я не понимаю, почему оно должно перестать работать.
Предложения, пожалуйста?
Примечание: этот вопрос похож на этот вопрос, который остается без ответа.
NB2: Существует неясный компонент VCL, называемый TShadowWindow , который выглядит так, как будто он будет работать правильно, но оказывается слишком грубо написанным для практического применения.
Обновление: Следуя комментариям Андреаса ниже, я исследовал это дальше и нашел некоторые тонкости.
Под Windows 7 я обнаружил, что тень не появляется при всплывающем окне , если оно находится над другим окном из того же приложения .
Вот простое приложение Delphi, которое использует CreateParams во всплывающем окне для запроса тени, как описано выше.
Посмотрите, как тень появляется там, где она выходит за пределы основного окна?
Но я хочу использовать окно без полей в качестве всплывающего окна над главным окном. Падающая тень отличает всплывающее окно от окна под ним. Все мое описание выше относится к этому обстоятельству. Очевидно, что какой-то механизм Windows вмешивается здесь.
Я также попробовал то же самое приложение под Windows XP. Вот как это выглядит.
Это работает правильно с тенью везде *. Г!
Похоже, что это похоже на Vista / W7, как предлагает Андреас.
(* В более ранней версии этого текста и screendump предполагалось, что тени не появляются. Однако это произошло из-за того, что у меня в Windows XP была отключена опция отображения «Тени под меню». Дух.)