Два одновременно активных окна
От: delphinchik Россия  
Дата: 22.04.05 07:51
Оценка:
Главная форма BorderStyle = bsNone. Сделал выезжающее сверху меню по кнопке на главной форме. Меню реализовано в виде отдельной формы (BorderStyle = bsSingle) которая содержит только компонент TMainMenu. То есть при нажатии на кнопку сверху главной формы появляется для пользователя как бы такая себе надстройка с главным меню программы. Перемещение двух форм сразу при перемещении одной из них реализовал, это несложно, достаточно перехватить сообщение WM_MOVING на обоих формах. Также сделал чтобы при работе с системными кнопками в форме меню действия применялись ко всему приложению (то есть минимизация и закрытие) — тут перехватил сообщение WM_SYSCOMMAND. Вот только есть одна "некрасивость". Если отображается форма меню и при этом пользователь работает с главной формой, то меню становится неактивным, это и понятно в общем то потому как в данный момент активна главная форма, но в этом случае возникает ощущение того, что приложение в целом неактивно. Как сделать так, чтобы при работе с главной формой, верхняя, встроенная форма с меню тоже была активна. Я попытался перехватить у главной формы сообщение WM_ACTIVATE и отправлять это же сообщение форме с меню, но получается что при любой активности на главной форме фокус сразу переводится на верхнюю форму, а нужно добиться только "активного цвета" ее заголовка но не фокуса. Буду благодарен за советы. Спасибо.

Вот примерно то что получается когда активна главная форма:
http://www.rsdn.ru:80/File/34064/menu.JPG
Re: Два одновременно активных окна
От: Softwarer http://softwarer.ru
Дата: 22.04.05 07:55
Оценка:
Здравствуйте, delphinchik, Вы писали:

Честно говоря, не особо врубился в желаемое, но советую обратить внимание на сообщение WM_NCPAINT и на api-шную функцию, кажется, DrawCaption — примерно так.
Re[2]: Два одновременно активных окна
От: delphinchik Россия  
Дата: 22.04.05 08:01
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, delphinchik, Вы писали:


S>Честно говоря, не особо врубился в желаемое, но советую обратить внимание на сообщение WM_NCPAINT и на api-шную функцию, кажется, DrawCaption — примерно так.

Желаемое: необходимо чтобы при работе в главной форме, верхняя форма с меню продолжала быть активной.
Re[3]: Два одновременно активных окна
От: DarkMaster Украина http://www.bdslib.at.ua
Дата: 22.04.05 08:32
Оценка:
Здравствуйте, delphinchik, Вы писали:

S>>Честно говоря, не особо врубился в желаемое, но советую обратить внимание на сообщение WM_NCPAINT и на api-шную функцию, кажется, DrawCaption — примерно так.

D>Желаемое: необходимо чтобы при работе в главной форме, верхняя форма с меню продолжала быть активной.

Визуально или как? Если визуально, то меню в якобы активном состоянии несложно и самому нарисовать.
WBR, Dmitry Beloshistov AKA [-=BDS=-]
Re[4]: Два одновременно активных окна
От: delphinchik Россия  
Дата: 22.04.05 08:43
Оценка:
Здравствуйте, DarkMaster, Вы писали:

DM>Здравствуйте, delphinchik, Вы писали:


S>>>Честно говоря, не особо врубился в желаемое, но советую обратить внимание на сообщение WM_NCPAINT и на api-шную функцию, кажется, DrawCaption — примерно так.

D>>Желаемое: необходимо чтобы при работе в главной форме, верхняя форма с меню продолжала быть активной.

DM>Визуально или как? Если визуально, то меню в якобы активном состоянии несложно и самому нарисовать.

Да, визуально.
Re[5]: Два одновременно активных окна
От: delphinchik Россия  
Дата: 22.04.05 09:17
Оценка:
Что то не получается:
procedure TMainForm.WMActivate(var Msg: TWMActivate);
var
  Rect:TRect;
begin
  inherited;
  if (FMenu <> nil) then
  begin
    Rect:=Bounds(FMenu.Left, FMenu.Top, FMenu.ClientWidth, FMenu.ClientHeight);
    DrawCaption(FMenu.Handle, GetWindowDC(FMenu.Handle), Rect, DC_ACTIVE);
  end;
end;
Re[6]: Два одновременно активных окна
От: Danchik Украина  
Дата: 22.04.05 11:07
Оценка:
Здравствуйте, delphinchik, Вы писали:

Сделай так на главной форме, и будет тебе счастье

procedure WMNCActivate (var Msg : TMessage); message WM_NCACTIVATE; 
...

procedure TForm1.WMNCActivate(var Msg: TMessage);
begin
  if Msg.WParam = 0 then
    Msg.WParam := 1;
  inherited;
end;
Re[7]: Два одновременно активных окна
От: delphinchik Россия  
Дата: 22.04.05 11:20
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Здравствуйте, delphinchik, Вы писали:


D>Сделай так на главной форме, и будет тебе счастье


D>
D>procedure WMNCActivate (var Msg : TMessage); message WM_NCACTIVATE; 
D>...

D>procedure TForm1.WMNCActivate(var Msg: TMessage);
D>begin
D>  if Msg.WParam = 0 then
D>    Msg.WParam := 1;
D>  inherited;
D>end;
D>

Спасибо большое, то что надо.
P.S. Вот только сделать это нужно было на форме с меню, ведь мне нужно чтобы она никогда не теряла активность...
Re[8]: Два одновременно активных окна
От: Danchik Украина  
Дата: 22.04.05 12:27
Оценка:
Здравствуйте, delphinchik, Вы писали:

D>Спасибо большое, то что надо.

D>P.S. Вот только сделать это нужно было на форме с меню, ведь мне нужно чтобы она никогда не теряла активность...
Слабо обратил внимание на какокй именно, важно было — что сделать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.