powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Постоянный заголовок у активной/неактивной формы
11 сообщений из 11, страница 1 из 1
Постоянный заголовок у активной/неактивной формы
    #38786078
Jeka-x87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При потере фокуса формы, заголовок и кнопки "закрыть/свернуть/развернуть" становятся как бы серыми.
Подскажите как сделать, чтобы при потере фокуса, у формы не менялся внешний вид, а был как у активной ?
...
Рейтинг: 0 / 0
Постоянный заголовок у активной/неактивной формы
    #38786110
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jeka-x87,

в настройках темы ОСи поменять цвета так, чтобы у активного и неактивного заголовка цвета совпадали?
...
Рейтинг: 0 / 0
Постоянный заголовок у активной/неактивной формы
    #38786190
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jeka-x87При потере фокуса формы, заголовок и кнопки "закрыть/свернуть/развернуть" становятся как бы серыми.
Подскажите как сделать, чтобы при потере фокуса, у формы не менялся внешний вид, а был как у активной ?Если программу пишешь для себя - то можешь сам неклиентскую часть отрисовывать. А если для других - то никак, если хочешь чтобы программой хоть кто-нибудь захотел пользоваться
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Постоянный заголовок у активной/неактивной формы
    #39497437
Кар-Кар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
TMain = class(TForm)
...
protected
  procedure WndProc(var Message:TMessage);override;
...
end;

procedure TMain.WndProc(var Message:TMessage);
begin
case Message.Msg of
WM_NCACTIVATE: TWMNCActivate(Message).Active := True;
end;
inherited WndProc(Message);
end;



Штатный режим:


Кликнули по рабочему столу (другое приложение и т.п.):

^Воот, но тут слегка у меня самого вопрос, а как узнать, что мое приложение было покинуто окончательно? Допустим щелкнули по этому рабочему столу. Вот тут хотелось бы все-таки перерисовать заголовок неактивным. Суть в том что у меня ни одна форма внутри программы как видно, и на Deactivate тут нельзя рассчитывать.

Есть ли глобальная Windows функция на всю систему "кто активен"? Все формы внутри собственные так что прошуршать список можно, не жалко если так.
...
Рейтинг: 0 / 0
Постоянный заголовок у активной/неактивной формы
    #39497441
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Постоянный заголовок у активной/неактивной формы
    #39497443
Кар-Кар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Истинно. Спасибо.
...
Рейтинг: 0 / 0
Постоянный заголовок у активной/неактивной формы
    #39497482
Кар-Кар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажись вышло, таймер на 1 мс, становится неактивным, бонус при возвращении: модальные MessageBox / ShowMessage / ShowModal не скидывают фокус. Вроде все, по первому клику откуда-то программа просто активируется, а затем уже можно жмакать по контролам т.е. нет "всквозь" такого; своим popup-ам на базе формы такую возможность прикрутил, весело стало, скоростное такое, лишний клик не нужно делать, чтобы нажать где-то че-то)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
TMain = class(TForm)
protected
  FNcActive : Boolean;
protected
  procedure WndProc(var Message:TMessage);override;
...

procedure TMain.WndProc(var Message:TMessage);
begin
case Message.Msg of
WM_NCACTIVATE: TWMNCActivate(Message).Active := FNcActive;
end;
inherited ;
end;

procedure TMain.TimerHeaderTimer(Sender: TObject);
var
P : HWND;
begin
if FNcActive <> Application.Active then
begin
  FNcActive := Application.Active;
  SendMessage(Handle,WM_NCACTIVATE,NativeInt(FNcActive),0);
  if FNcActive then
  begin
    P := GetLastActivePopup(Handle);
    if P <> 0 then
      Winapi.Windows.SetFocus(P);
  end;
end;
end;
...
Рейтинг: 0 / 0
Постоянный заголовок у активной/неактивной формы
    #39497487
Кар-Кар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, там BOOL должен быть, не Boolean.
...
Рейтинг: 0 / 0
Постоянный заголовок у активной/неактивной формы
    #39498080
Кар-Кар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Воттерь идеально( в смысле для юзера, а последствия в коде неизвестны ). Без таймера, перерисовка без задержок для модальных мессадж боксов / форм, и сквозной клик работает.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
uses
  ...
  Vcl.AppEvnts;

type
  TMain = class(TForm)
    procedure FormCreate(Sender: TObject);
  protected
    FNcActive : BOOL;
  protected
    procedure ApplicationEventsMessage(var Msg: tagMSG; var Handled: Boolean);
    function ApplicationHook(var Message:TMessage):Boolean;
    procedure WndProc(var Message:TMessage);override;
...

procedure TMain.ApplicationEventsMessage(var Msg: tagMSG; var Handled: Boolean);
var
I : Integer;
W : HWND;
begin
with Application, Screen do
  case Msg.message of
  CM_ACTIVATE:
    begin
      { Setting active explicitly. }
      FNcActive := True;
      SendMessage(MainFormHandle,WM_NCACTIVATE,1,0);

      { Last active window (?) }
      W := GetLastActivePopup(Handle);

      { Modal forms need not to loose focus. }
      if ModalLevel > 0 then
        for I := 0 to FormCount-1 do
          if W = Forms[I].Handle then
             Exit;

      { Unknown original implementation. }
      if Assigned(MainForm) and MainFormOnTaskBar and not IsWindowEnabled(MainFormHandle)
         and (W <> MainFormHandle) then Winapi.Windows.SetFocus(W);

      Handled := True;
    end;
  CM_DEACTIVATE:
    begin
      { Setting inactive explicitly. }
      FNcActive := False;
      SendMessage(MainFormHandle,WM_NCACTIVATE,0,0);

       { Hiding all custom popups. }
      if ModalLevel = 0 then
        for I := 0 to FormCount-1 do
          if Forms[I].InheritsFrom(TPopup) then
             Forms[I].Hide;

      Handled := True;
    end;
  end;
end;

function TMain.ApplicationHook(var Message:TMessage):Boolean;
var
Msg : tagMSG;
begin
{ Modal message boxes support. }
case Message.Msg of
WM_ACTIVATEAPP:
  begin
    if TWMActivateApp(Message).Active then
      Msg.message := CM_ACTIVATE else
      Msg.message := CM_DEACTIVATE;
    ApplicationEventsMessage(Msg,Result);
    Result := False; //True?
  end;
CM_ACTIVATE,
CM_DEACTIVATE:
  begin
    Msg.message := Message.Msg;
    ApplicationEventsMessage(Msg,Result);
    Result := True;
  end;
else
  Result := False;
end;
end;

procedure TMain.WndProc(var Message:TMessage);
begin
case Message.Msg of
WM_NCACTIVATE:
   if not TWMNCActivate(Message).Active then //comment this line ?
     TWMNCActivate(Message).Active := FNcActive;
end;
inherited WndProc(Message);
end;

procedure FormCreate(Sender: TObject);
begin
Application.HookMainWindow(ApplicationHook);
end;

Потестил ещё оригинальный vcl:
• не мигают модальные формы, если кликаешь по левым заблоченным формам.
• кастомные popup на базе формы замигивают полоску на таскбаре.
• с ними же невозможно сохранять рабочее окно активным, при закрытии так и норовит переключить фокус ВАЩЕ на левое (если есть).
• в таск менеджере если сделать switch to "ваша программа", то опять активируется какое-то левое вторичное окно, вместо того чтобы активировать последнее активное (до покидания программы).

короче этот ваш интерфейс делать лажа полнейшая.
...
Рейтинг: 0 / 0
Постоянный заголовок у активной/неактивной формы
    #39498229
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кар-Карэтот ваш интерфейс делать
Код: pascal
1.
2.
3.
4.
 Application.OnMessage
  Perform
  PostMessage
  DefWindowProc
...
Рейтинг: 0 / 0
Постоянный заголовок у активной/неактивной формы
    #39498722
Кар-Кар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeMКар-Карэтот ваш интерфейс делать
Код: pascal
1.
2.
3.
4.
 Application.OnMessage
  Perform
  PostMessage
  DefWindowProc


Самому? По-моему это саму VCL проапгрейдить надо бы уже, у меня мигрень началась когда переключение между главным и вторичными мелькало. Совершенно бессмысленная деактивация главного.

Ещё нашел:
• Если модальный мессадж был открыт с кастомной popup-формы, то switch to в таск менеджере просто генерирует бип. И все. У них там своя WindowProc где-то (StdWindowProc вроде в сырцах видел) и никаких сообщений не посылается в Application.

Нет бипа(сообщение вызывается с кнопки отмена/назад стрелка которая):


Есть бип(ужали форму, перенесли на кастомную popup-форму, нажали оттуда):

Но это другая тема.
_________

Внезапно, TTaskDialog (Vista и выше) скидывал фокус и не работал сквозной клик. И модальные мессаджи с popup-форм (как выше) не могли сразу быть кликнуты, стандартный код с SetFocus все портил, снес:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
procedure TMain.ApplicationEventsMessage(var Msg: tagMSG; var Handled: Boolean);
var
I : Integer;
W : HWND;
begin
with Application, Screen do
  case Msg.message of
  CM_ACTIVATE:
    begin
      { Setting active explicitly. }
      FNcActive := True;
      SendMessage(MainFormHandle,WM_NCACTIVATE,1,0);
      Handled := True;

      { Modal TForms need not to loose focus. }
      if ModalLevel > 0 then
      begin
        W := GetLastActivePopup(Handle);
        for I := 0 to FormCount-1 do
          if W = Forms.Handle then
            Exit;
      end;
    end;
  CM_DEACTIVATE:
    begin
      { Setting inactive explicitly. }
      FNcActive := False;
      SendMessage(MainFormHandle,WM_NCACTIVATE,0,0);
      Handled := True;

       { Hiding all custom popups. }
      if ModalLevel = 0 then
        for I := 0 to FormCount-1 do
          if Forms[I].InheritsFrom(TPopup) then
             Forms[I].Hide;
    end;
  end;
end;


ВсЁ, моментальная активация главного в независимости от кликнутого внутри, а то там тормоз был, когда по вторичным внутри формам/сообщениям именно [i]зажимаешь
- лишь через пол-секунды главное активным рисовалось.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Постоянный заголовок у активной/неактивной формы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]