Конференция "WinAPI" » Какое событие возникает при изменении Z-order
 
  • KilkennyCat © (13.12.12 20:52) [0]
    у TСontrol?
  • KilkennyCat © (13.12.12 20:54) [1]
    промахнулся разделом форума, извините.
  • Rouse_ © (13.12.12 20:54) [2]
    В смысле при BringToFront?
  • KilkennyCat © (13.12.12 21:03) [3]
    да
  • Rouse_ © (13.12.12 21:20) [4]
    Выставляется через SetWindowPos, соответственно в обычном контроле событие не поймаешь (нет его), но если написать наследника, то в нем можно перекрыть соответствующую нотификацию
  • Rouse_ © (13.12.12 21:20) [5]
    зы:

    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;

  • Rouse_ © (13.12.12 21:22) [6]
    ззы: ну и до кучи (основной метод, когда есть парент)

    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
  • Dimka Maslov © (13.12.12 21:22) [7]
    Я обычно пользуюсь Spy++ если хочу узнать какое событие когда и куда приходит.
  • KilkennyCat © (13.12.12 21:27) [8]

    > Rouse_ ©

    ага, спасибо. сейчас дочитаю про EVENT_OBJECT_REORDER и если не прокатит - воспользуюсь твоим вариантом перекрытия.


    > Dimka Maslov ©

    и как его в мою программу интегрировать? :)
  • Игорь Шевченко © (13.12.12 21:28) [9]
    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

  • KilkennyCat © (13.12.12 21:40) [10]

    > Игорь Шевченко ©   (13.12.12 21:28) [9]

    ага! спасибо.
    странно, что WM_WINDOWPOSCHANGED смолчало
  • Dimka Maslov © (13.12.12 21:42) [11]

    > и как его в мою программу интегрировать? :)


    В программу никак, но как внешний журнал событий вполне себе приемлемо.
  • Rouse_ © (13.12.12 21:45) [12]

    > KilkennyCat ©   (13.12.12 21:40) [10]
    >
    > > Игорь Шевченко ©   (13.12.12 21:28) [9]
    >
    > ага! спасибо.
    > странно, что WM_WINDOWPOSCHANGED смолчало

    Оно может тушится внутрях, подпишись на CM_WINDOWPOSCHANGED
  • Игорь Шевченко © (13.12.12 21:57) [13]
    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 никаких сообщений не проходит
  • KilkennyCat © (13.12.12 22:20) [14]
    Всем огромное спасибо, теперь у моей панельки есть FStayOnTop.
  • O'ShinW © (14.12.12 09:36) [15]

    > Игорь Шевченко ©   (13.12.12 21:57) [13]

    DefaultHandler перекрыт?
  • Игорь Шевченко © (14.12.12 13:46) [16]

    > DefaultHandler перекрыт?


    Нет. Он не перекрывается. Заменена WindowProc
 
Конференция "WinAPI" » Какое событие возникает при изменении Z-order
Есть новые Нет новых   [134430   +3][b:0][p:0.003]