Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2009, 12:12   #1
blackstersl
Форумчанин
 
Аватар для blackstersl
 
Регистрация: 23.08.2008
Сообщений: 374
По умолчанию прозрачность формы.

Привет всемю Как сделать так чтоб форма была прозрачной а компоненты на ней оставались такими как есть. Спасибо.
blackstersl вне форума Ответить с цитированием
Старый 04.06.2009, 12:19   #2
Земляника
Пользователь
 
Аватар для Земляника
 
Регистрация: 04.06.2009
Сообщений: 13
По умолчанию

Насколько мне известно Делфи, такое невозможно
Спят усталые админы, мышки спят.Флешки и клавиатуры ждут ребят.Windows тоже спать ложится, Чтобы ночью нам приснитьсяАську закрывай. Баю-бай.
Земляника вне форума Ответить с цитированием
Старый 04.06.2009, 12:23   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Насколько мне известно Делфи, такое невозможно
Ну прям уж так нет, но можно извернуться по другому выделяя компоненты в другие подчиненные формы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.06.2009, 12:23   #4
blackstersl
Форумчанин
 
Аватар для blackstersl
 
Регистрация: 23.08.2008
Сообщений: 374
По умолчанию

BaronTreep ошибку выдаёт на
Код:
...longint; stdcall; external 'USER32.DLL';
.
blackstersl вне форума Ответить с цитированием
Старый 04.06.2009, 12:30   #5
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

function SetLayeredWindowAttributes(hwnd: longint; crey: byte; bAlpha: byte; dwFlags: longint): longint; stdcall; external 'USER32.DLL';

Этого можно не делать.

Цитата:
но можно извернуться по другому выделяя компоненты в другие подчиненные формы.
В принципе, с помощью регионов можно было бы реализовать, я сталкивался с формами произвольной формы, но с произвольной прозрачностью - нет! Как бы это сделать, по аналогии с регионами?
BaronTreep вне форума Ответить с цитированием
Старый 04.06.2009, 12:42   #6
Noor
Участник клуба
 
Аватар для Noor
 
Регистрация: 01.11.2006
Сообщений: 1,051
По умолчанию

Поиском пользовались ????? Гугл рулит !!!

Создадим новый модуль (В последствии его будем подключать к нашим формам).
Создим два типа: TChildForm (дочернее окно), TParentForm (родительское окно).
Код:
TChildForm = class(TForm)
  private
  protected
    ParentForm: TParentForm;
    procedure CreateParams(var Params: TCreateParams); override;
    procedure WMActivate(var Message: TWMActivate); message WM_ACTIVATE;
    procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
  public
    constructor Create(AOwner: TComponent); override;
  end;

  TParentForm = class(TForm)
  private
  protected
    FChildForm:TChildForm;
    procedure WMWindowPosChanged(var MSG: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED;
  public
    function GetRect:TRect;
  published
    property ChildForm:TChildForm read FChildForm write FChildForm;
  end;
Если Вы заметили то в каждом класе в нутри будет хранится дочерняя/родительская форма.
Теперь по порядку с обработчиками дочирной формы:
Кто создаст тот и родитель
Код:
constructor TChildForm.Create(AOwner: TComponent);
begin
  if AOwner<>nil then ParentForm:=TParentForm(AOwner);
  inherited;
end;
Ну и самое главное перекрыть CreateParams, так как нам нужно чтобы дочирняя форма всегда была над родительской.
Код:
procedure TChildForm.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
  begin
    if ParentForm <> nil then WndParent := ParentForm.handle; 
    // вот после этой строки мы и будет она висеть сверху
    // но если форма главная то этот код делать не обязательно

    // SetWindowLong(ParentForm.Handle, GWL_STYLE, Style);
    // тут можна передать стиль дочерней формы в 
    Style := WS_POPUP; // делаем форму без бордюра меню и тд.
  end;
end;
Ну и дополнтеные, не столь важные обработчики.
Отслежывание изминения заголовка
Код:
procedure TChildForm.CMTextChanged(var Message: TMessage);
begin
  if ParentForm <> nil then
    ParentForm.Caption := Caption;
end;
поддержка авкивности бордюра, когда активна дочерняя форма
Код:
procedure TChildForm.WMActivate(var Message: TWMActivate);
begin
  if ParentForm <> nil then
    SendMessage(ParentForm.Handle, WM_NCACTIVATE, 1, 0);
end;
Теперь обработчики главной формы:
Обработка ресайза или перемещения формы
Код:
procedure TParentForm.WMWindowPosChanged(var MSG: TWMWindowPosChanged);
begin
   inherited;
   if FChildForm <> nil then FChildForm.BoundsRect := GetRect;
end;
Получение позиции для дочерней формы
Код:
function TParentForm.GetRect: TRect;
var
  iBorder,iFrame,iCaption:integer;
begin
  iBorder := GetSystemMetrics(SM_CXBORDER);
  iFrame := GetSystemMetrics(SM_CYDLGFRAME);
  iCaption := GetSystemMetrics(SM_CYCAPTION);
  
  result.Left := BoundsRect.Left + iBorder + iFrame;
  result.Right := BoundsRect.Right - iBorder - iFrame;
  result.Bottom := BoundsRect.Bottom - iBorder - iFrame;
  result.Top := BoundsRect.Top + iBorder + iFrame + iCaption;

// то что сверху и снизу бедут делать идентычну работу 
// я просто зделал по меньше вызовов процедуры GetSystemMetrics
{  result.Left:=BoundsRect.Left + GetSystemMetrics(SM_CXBORDER)
                               + GetSystemMetrics(SM_CYDLGFRAME);
  result.Right:=BoundsRect.Right - GetSystemMetrics(SM_CYBORDER)
                                 - GetSystemMetrics(SM_CYDLGFRAME);
  result.Bottom:=BoundsRect.Bottom - GetSystemMetrics(SM_CXBORDER)
                                   - GetSystemMetrics(SM_CYDLGFRAME);
  result.Top:=BoundsRect.Top + GetSystemMetrics(SM_CYBORDER)
                             + GetSystemMetrics(SM_CYDLGFRAME)
                             + GetSystemMetrics(SM_CYCAPTION);        }
end;
продолжение следует ....
Noor вне форума Ответить с цитированием
Старый 04.06.2009, 12:44   #7
Noor
Участник клуба
 
Аватар для Noor
 
Регистрация: 01.11.2006
Сообщений: 1,051
По умолчанию

Продолжение

Теперь если вы создадите две формы. подключите этот модуль. В одной форме поменяете родительский клас на TParentForm а в дочерней на TChildForm и запустите на выполнения то не должно ничего показывать того что это две формы. При этом вы можете поменять параметры AlphaBlend.
Но когда вам захочется закрыть форму то тут они будут разноглавствовать.
Ну что ж… перекрываем в главной обработчик CloseQuery
Код:
function CloseQuery: Boolean; override; 
…
function TParentForm.CloseQuery: Boolean;
var
  CAction: TCloseAction;
begin
  result := true;
  FCloseFlag := true; // ставим флаг, что главная занимается закритием дочерней формы
  if FChildForm <> nil then 
  with FChildForm do
  begin
    result := CloseQuery; // вызываем у дочерней обработчик CloseQuery (вдруг пользователь чтото сохранить хочет)
    if result then
    begin
      CAction := caNone;
      DoClose(CAction); // вызываем обработчик Close (но нам побарабону что он там вернет ведь решает главная )
      free;                        // Уничтожаем
    end;
  end;
  FCloseFlag := not result;
end;
Теперь при закрытии главной формы будет закрыватся и дочерняя, при этом будут вызваны все пользовательские обработчики.
Но что будет если закрытие поступит из дочерней?
И эта проблема решается
В поле public созадем процедуру close которая заменит оригинальную
Код:
procedure TChildForm.close;
begin
  if ParentForm <> nil then
    if not ParentForm.CloseFlag then ParentForm.Close;
    // проверяем. Может главная уже делает закритие дочерней
    // если нет то закрываем главную, а не дочернюю
end;
вот и все.

Еще тут посмотри
Исодник + оригинал статейки+картинка того что дожно получиться !
Вложения
Тип файла: zip AlphaForm.zip (188.9 Кб, 56 просмотров)

Последний раз редактировалось Noor; 04.06.2009 в 12:47.
Noor вне форума Ответить с цитированием
Старый 04.06.2009, 12:52   #8
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

++ Заплюсовал ;-) ++
BaronTreep вне форума Ответить с цитированием
Старый 04.06.2009, 13:22   #9
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Цитата:
Сообщение от BaronTreep Посмотреть сообщение
function SetLayeredWindowAttributes(hwnd: longint; crey: byte; bAlpha: byte; dwFlags: longint): longint; stdcall; external 'USER32.DLL';

Этого можно не делать.



В принципе, с помощью регионов можно было бы реализовать, я сталкивался с формами произвольной формы, но с произвольной прозрачностью - нет! Как бы это сделать, по аналогии с регионами?
Ну это вряд ли. Помощник Microsoft Office — это Layered Window.

У Layered Windows есть разные режимы работы. Можно просто сделать окно прозрачным. Можно установить ключевой цвет, на месте которого будет дырка. А можно сделать полноценное Layered Window, на котором можно рисовать 32–битным цветом. Не спрашивайте меня, что это значит Но это можно. Большинство компонентов наверняка будут по привычке отрисовываться плотными, так что нужно активировать полноценную Layered Window'зность и перехватывать событие erase, отрисовывая полупрозрачный фон.
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
прозрачность отдельных участков формы Романнн Общие вопросы Delphi 38 30.01.2010 20:04
Не ставиться прозрачность формы Лукманов Александр Общие вопросы Delphi 0 27.04.2009 18:13
Прозрачность формы PNG, 2xTCV и др. Veiron Мультимедиа в Delphi 6 25.05.2008 01:19
Как задать прозрачность формы dimfil Общие вопросы Delphi 2 09.11.2007 09:53
Прозрачность ЧИЖ HTML и CSS 5 24.10.2007 17:18