-
у TСontrol?
-
промахнулся разделом форума, извините.
-
В смысле при BringToFront?
-
да
-
Выставляется через SetWindowPos, соответственно в обычном контроле событие не поймаешь (нет его), но если написать наследника, то в нем можно перекрыть соответствующую нотификацию
-
зы: procedure TWinControl.SetZOrder(TopMost: Boolean);
const
WindowPos: array[Boolean] of Word = (HWND_BOTTOM, HWND_TOP);
var
N, M: Integer;
begin
if FParent <> nil then
begin
if TopMost then N := FParent.FWinControls.Count - 1 else N := 0;
M := 0;
if FParent.FControls <> nil then M := FParent.FControls.Count;
SetZOrderPosition(M + N);
end
else if FHandle <> 0 then
SetWindowPos(FHandle, WindowPos[TopMost], 0, 0, 0, 0,
SWP_NOMOVE + SWP_NOSIZE);
end;
-
ззы: ну и до кучи (основной метод, когда есть парент) procedure TWinControl.SetZOrderPosition(Position: Integer);
var
I, Count: Integer;
Pos: HWND;
begin
if FParent <> nil then
begin
if FParent.FControls <> nil then
Dec(Position, FParent.FControls.Count);
I := FParent.FWinControls.IndexOf(Self);
if I >= 0 then
begin
Count := FParent.FWinControls.Count;
if Position < 0 then Position := 0;
if Position >= Count then Position := Count - 1;
if Position <> I then
begin
FParent.FWinControls.Delete(I);
FParent.FWinControls.Insert(Position, Self);
end;
end;
if FHandle <> 0 then
begin
if Position = 0 then Pos := HWND_BOTTOM
else if Position = FParent.FWinControls.Count - 1 then Pos := HWND_TOP
else if Position > I then
Pos := TWinControl(FParent.FWinControls[Position + 1]).Handle
else if Position < I then
Pos := TWinControl(FParent.FWinControls[Position]).Handle
else Exit;
SetWindowPos(FHandle, Pos, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);
end;
end;
end; на манипуляции со списками хорошим образом не встать: FParent.FWinControls.Delete
-
Я обычно пользуюсь Spy++ если хочу узнать какое событие когда и куда приходит.
-
> Rouse_ ©
ага, спасибо. сейчас дочитаю про EVENT_OBJECT_REORDER и если не прокатит - воспользуюсь твоим вариантом перекрытия.
> Dimka Maslov ©
и как его в мою программу интегрировать? :)
-
procedure TForm1.Button1Click(Sender: TObject);
begin
LogStr('***BRING');
Memo1.BringToFront;
end; 0325E999 ***BRING
0325E999 Memo1.WndProc: HWND=000B05AA (Memo1(TMemo)) MSG=WM_WINDOWPOSCHANGING WPARAM=00000000 LPARAM=0012F4AC
0325E999 Memo1.WndProc: WM_WINDOWPOSCHANGING returns 0
0325E999 Memo1.WndProc: HWND=000B05AA (Memo1(TMemo)) MSG=WM_CHILDACTIVATE WPARAM=00000000 LPARAM=00000000
0325E999 Memo1.WndProc: WM_CHILDACTIVATE returns 0
0325E999 Memo1.WndProc: HWND=000B05AA (Memo1(TMemo)) MSG=WM_NCPAINT WPARAM=4C041709 LPARAM=00000000
0325E999 Memo1.WndProc: WM_NCPAINT returns 0
0325E999 Memo1.WndProc: HWND=000B05AA (Memo1(TMemo)) MSG=WM_ERASEBKGND WPARAM=4B012397 LPARAM=00000000
0325E999 Memo1.WndProc: WM_ERASEBKGND returns 1
0325E999 Memo1.WndProc: HWND=000B05AA (Memo1(TMemo)) MSG=WM_WINDOWPOSCHANGED WPARAM=00000000 LPARAM=0012F4AC
0325E999 Memo1.WndProc: WM_WINDOWPOSCHANGED returns 0
0325E999 Button1.WndProc: CN_COMMAND returns 0
0325E999 Form1.WndProc: WM_COMMAND returns 0
-
> Игорь Шевченко © (13.12.12 21:28) [9]
ага! спасибо. странно, что WM_WINDOWPOSCHANGED смолчало
-
> и как его в мою программу интегрировать? :)
В программу никак, но как внешний журнал событий вполне себе приемлемо.
-
> KilkennyCat © (13.12.12 21:40) [10] > > > Игорь Шевченко © (13.12.12 21:28) [9] > > ага! спасибо. > странно, что WM_WINDOWPOSCHANGED смолчало
Оно может тушится внутрях, подпишись на CM_WINDOWPOSCHANGED
-
KilkennyCat © (13.12.12 21:40) [10] Для чистоты эксперимента тоже самое с TControl procedure TForm1.Button2Click(Sender: TObject);
begin
LogStr('***BRINGLABEL');
Label1.BringToFront;
end; 03406AD0 ***BRINGLABEL
03406AD0 Button2.WndProc: CN_COMMAND returns 0
03406AD0 Form1.WndProc: WM_COMMAND returns 0 Через TControl.WindowProc никаких сообщений не проходит
-
Всем огромное спасибо, теперь у моей панельки есть FStayOnTop.
-
> Игорь Шевченко © (13.12.12 21:57) [13]
DefaultHandler перекрыт?
-
> DefaultHandler перекрыт?
Нет. Он не перекрывается. Заменена WindowProc
|