Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.22;
Скачать: CL | DM;

Вниз

Тень от формы   Найти похожие ветки 

 
Степан   (2007-02-26 17:37) [0]

Windows 2000/XP способны создавать тени от окон. Я делал окно на API и полностью убедился, что это работает вот таким образом:
 
 ...
 // Параметры оконного класса и окна //
 with WndClassParams do begin
   Style := CS_HREDRAW or CS_VREDRAW or CS_DROPSHADOW;
   BGIcon := BIGIcon;
   SMIcon := SMLIcon;
   Cursor := LoadCursor(0, IDC_ARROW);
   Background := BKGBrush;
   MenuName := Nil;
 end;
 with WndParams do begin
   Style := WS_BORDER or WS_CAPTION; // Пока пусть будет "нормальным" окном
   Caption := "QStar";
   Width := QStarSettings.QBtnsParams.Width + QStarSettings.QBtnsParams.HorDist * 2;
   Height := (QStarSettings.QBtnsParams.Height * QStarSettings.QBtnsParams.Count) +
     (QStarSettings.QBtnsParams.VerDist * (QStarSettings.QBtnsParams.Count + 1)) + 15 - 1;
   Left := GetSystemMetrics(SM_CXSCREEN) - Width - 30;
   Top := 30;
   Menu := 0;
 end;
 ...
   if Handle <> 0 then begin // Если окно успешно создано, то ...
     // Убираем заголовок и рамку (not WS_CAPTION и not WS_BORDER), окно не
     // появляется в TaskBar"е и по Alt+Tab (WS_EX_TOOLWINDOW), даем окну
     // возможность делаться полупрозрачным (WS_EX_LAYERED) //
     SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) and
       ((not WS_CAPTION) and (not WS_BORDER)));
     SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or
       WS_EX_TOOLWINDOW);
     SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or
       WS_EX_LAYERED);
 ...


Решил попробовать реализовать это на формах в Delphi. Сделал так:

...
procedure TParamsInfoForm.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 Params.WindowClass.style := Params.WindowClass.style or CS_DROPSHADOW;
end;
...
 Application.CreateForm(TParamsInfoForm, ParamsInfoForm);
 SetWindowLong(ParamsInfoForm.Handle, GWL_EXSTYLE,
   GetWindowLong(ParamsInfoForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
...


Но ничего не получается. При отображении окна, получается, что оно как-будто бы "невидимое", т.е. фактически на экране не появляется, но снятие фокуса с главного окна происходит. Что не правильно, подскажите.


 
DVM ©   (2007-02-26 17:47) [1]

procedure TSplashForm.CreateParams(var Params: TCreateParams);
const
 CS_DROPSHADOW = $00020000;
begin
 inherited;
 if GetOSVersion >= OsWinXP then
   Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW;
end;

В Win2000 данный код не работает - программа вообще не запускается или вылетает с ошибкой.


 
Степан   (2007-02-26 18:18) [2]

> [1] DVM ©   (26.02.07 17:47)

Не работает... даже под XP.


 
Amoeba ©   (2007-02-26 21:33) [3]

Господа, нам бы ваши проблемы.


 
RASkov   (2007-02-26 22:05) [4]

Тут недавно был уже такой вопрос.
procedure TForm1.FormCreate(Sender: TObject);
const CS_DROPSHADOW = $00020000;
begin
 SetClassLong(Handle, GCL_STYLE, GetWindowLong(Handle, GCL_STYLE) or CS_DROPSHADOW);
end;



Страницы: 1 вся ветка

Текущий архив: 2007.04.22;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.061 c
1-1172047081
paradox01
2007-02-21 11:38
2007.04.22
Как изменить курсор?


2-1175151426
VologdaBobR
2007-03-29 10:57
2007.04.22
Поиск и открытие документа Word


2-1175256043
Vvw
2007-03-30 16:00
2007.04.22
Ищу компоненту Timer,которая умеет запускаться в отдельном потоке


11-1154891295
ANTPro
2006-08-06 23:08
2007.04.22
Компилятор для KOL


1-1172648569
serg_mds
2007-02-28 10:42
2007.04.22
Разработка OPC сервера