Я создал производную 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, который выглядит ужасно). Это всплывающее окно, а не дочернее окно, поэтому я не понимаю, почему он должен потерпеть неудачу.
Предложения пожалуйста?
NB: это аналогичный вопрос в вопросе this, который остается без ответа.
NB2: Существует неясный компонент VCL, называемый TShadowWindow, который выглядит так, как будто он будет поступать правильно, но оказывается слишком грубо написано, чтобы быть практичным.
Обновление: Следуя комментариям Андреаса ниже, я исследовал это дальше и нашел некоторые тонкости.
В Windows 7 я обнаружил, что тень не появляется, когда всплывающее окно, если оно находится над другим окном из того же приложения.
Вот простое приложение Delphi, которое использует CreateParams во всплывающем окне для запроса тени, как описано выше.
Посмотрите, как появляется тень, где она выходит за пределы главного окна?
Но я хочу использовать окно без полей как всплывающее окно в главном окне. Тень отбрасывает всплывающее окно из окна под ним. Все мое описание выше относится к этому обстоятельству. Очевидно, что некоторые механизмы Windows вмешиваются здесь.
Я также попробовал одно и то же приложение под Windows XP. Вот как это выглядит.
Это верно работает с тенью везде *. Г!
Таким образом, это похоже на Vista/W7, как предполагает Андреас.
(* Более ранняя версия этого текста и screendump показала, что тени не появилось. Однако это оказалось потому, что у меня была опция отображения Windows XP "Shadows under menus" выключена.)