Когда окно A является шоу, я хочу не показать другому ни один - модальное всплывающее окно B, но:
Как Вы видите, окно B, которое я хочу, является чем-то как более применимое всплывающее окно как всплывающее меню (который является меньше препятствием, чем генерал ни один - модальное окно, когда Вы хотите, чтобы оно ушло путем нажатия на любую другую часть родительского окна).
Я ясен по своему вопросу?Спасибо.
Чтобы окно не попало в фокус, необходимо либо задать стиль расширенного окна WS_EX_NOACTIVATE
(Windows 2000 и выше), либо обрабатывать WM_MOUSEACTIVATE
и возвращать MA_NOACTIVATE
.
Я могу использовать это, чтобы не потерять фокус:
SetWindowPos(Form2.Handle, HWND_TOP, 0, 0, 0, 0,
SWP_SHOWWINDOW or SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOMOVE);
Вторая часть, которую я не очень хорошо понимал.
Невозможно удалить все атрибуты. Вы должны быть более конкретными в своем первом правиле, чтобы оно было нацелено только на те элементы, которые вы хотите. Либо это, либо необходимо явно задать нужные значения для второго правила.
-121--4378755-Невозможно. Необходимо вручную сбросить каждый из них. При необходимости перехода между основными различиями, например, при щелчке элемента пользователь может удалить их из самого элемента и поместить в класс. Итак, это:
#search-box {
color:blue;
}
Становится следующим:
#search-box {
color:red;
}
#search-box.focused {
color:blue;
}
Теперь в любой момент необходимо внести радикальные изменения в дисплее элемента, добавить или удалить класс .focused
.
Самое простое решение, которое я нашел для «1» - отправить WM_NCACTIVATE в вызывающую форму, как только всплывающая форма активируется (в обработчике WM_ACTIVATE), чтобы вызывающая форма рисовала свои подписи активными цветами. Для этого необходимо иметь ссылку на вызывающую форму во всплывающей форме.
Для «2» можно освободить всплывающую форму в том же обработчике WM_ACTIVATE, это не съест клики, которые переходят к вызывающей форме.
Так что стч. таким образом, необходимо перейти к всплывающей форме;
type
TForm2 = class(TForm)
[..]
private
FOwner: TForm;
procedure WmActivate(var Msg: TWMActivate); message WM_ACTIVATE;
public
constructor Create(AOwner: TComponent); override;
[...]
constructor TForm2.Create(AOwner: TComponent);
begin
if not (AOwner is TForm) then
raise Exception.Create('Owner should be TForm');
FOwner := TForm(AOwner);
inherited;
end;
procedure TForm2.WmActivate(var Msg: TWMActivate);
begin
SendMessage(FOwner.Handle, WM_NCACTIVATE, Ord(Msg.Active <> WA_INACTIVE), 0);
inherited;
if Msg.Active = WA_INACTIVE then
Release;
end;
и предоставить вызывающую форму в качестве владельца всплывающей формы;
procedure TForm1.Button1Click(Sender: TObject);
var
PopForm: TForm2;
begin
PopForm := TForm2.Create(Self);
[..]
SpTBXFormPopupMenu из spTBXLib выполняет эту работу.
Зайдите на http://www.silverpointdevelopment.com/sptbxlib/index.htm и найдите "Form Popup"
Похоже, что контейнер "popuped" должен наследовать TPopupMenu. Но работа с ним очень сложная, вы можете увидеть это самостоятельно в коде. Я рекомендую использовать его как есть в пакете, потому что Роберт Ли проделал отличную работу.
Я нашел тот, который делает почти то, что я хочу: TAdvStickyPopupMenu