Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дочерние окна при сворачивании главного


Страницы:   1 2

RDS ©   (2006-07-05 16:54:00) 

Программа создает массив дочерних окон. Как можно следать, чтобы при сворачивании главного окна программы, дочерние окна оставались на экране.


!_SM_!   (2006-07-08 16:31:00) [1]


> Eraser ©   (08.07.06 01:37) [35]

Нет, не забыл ...
только вот без этого делал - WMWindowPosChanging
На панеле задач для каждой формы своя панелька.
И свернув первую(главную), при появлении хинта на второй, первая не разворачивается. и ничего особого не происходит хинт отоброжается, прячется...отоброжается...прячется... вообщем первая лежит на "панеле"
пока по ней не "щелкнешь"... ВОТ.


Eraser   (2006-07-08 01:37:00) [2]

> [34] !_SM_!   (07.07.06 23:52)

не забыли во второй форме перекрыть CreateParams?


!_SM_!   (2006-07-07 23:52:00) [3]


> Юрий Зотов ©   (07.07.06 09:12) [29]
> > Eraser
>Проверил с D7 и XP SP2 - точно, есть такой эффект.

У меня D7 и XP SP2 - НЕТ такого эффекта. Все нормально, при появлении hint'a на второй форме, первая никуда ни выскакивает....
Дело наверное не в сочетании D и Win....


Eraser   (2006-07-07 19:28:00) [4]

> [32] Юрий Зотов ©   (07.07.06 19:14)

да это я понял )

но мысль понятна.


Юрий Зотов   (2006-07-07 19:14:00) [5]

> Eraser ©   (07.07.06 16:24) [31]

Только надо иметь в виду, что код в [30] - это пример, а не готовое решение. Пример работает, если при показе хинта мышь находится над самой формой TForm2,  но он не сработает, если мышь находится над каким-то из лежащих на ней контролов. Чтобы он сработал, в любом случае, нужно сначала с помощью FindControl сначала получить этот контрол (как в примере), затем проверить его на nil и получить форму, на которой он лежит (что-то типа GetParentForm) - вот ее класс уже и сравнивать с TForm2.


Eraser   (2006-07-07 16:24:00) [6]

> [30] Юрий Зотов ©   (07.07.06 10:07)

хитрый способ :) спасибо, буду иметь ввиду.


Юрий Зотов   (2006-07-07 10:07:00) [7]

> Eraser ©   (06.07.06 22:01) [27]

А справиться с этим можно и проще:

procedure TForm1.WMWindowPosChanging(var Message: TWMWindowPosChanging);
begin
 inherited;
 if (FindControl(GetForegroundWindow) is TForm2) and
    (FindControl(WindowFromPoint(Mouse.CursorPos)) is TForm2) then
    with Message.WindowPos^ do
      flags := flags or SWP_NOZORDER
end;


Юрий Зотов   (2006-07-07 09:12:00) [8]

> Eraser

Проверил с D7 и XP SP2 - точно, есть такой эффект.


ViK   (2006-07-07 04:59:00) [9]

У меня была подобная проблема, TUser посоветовал: "Не делать сворачиваемое окно главным."
Вроде бы все работает, и не надо никаких особых обработчиков


Eraser   (2006-07-06 22:01:00) [10]

преведенный мной в [25] вариант, к сожалению работает не стабильно, как и ожидалось.

вот более стабильный вариант, но 100% не гарантирую.

1. в dpr фал добавляем
 SetWindowLong(Application.Handle, GWL_EXSTYLE,
   GetWindowLong(Application.Handle, GWL_EXSTYLE) or
   WS_EX_TOOLWINDOW);

тем самамым скрывая кнопку application из таск-бара.
2. в главной форме приложения добавляем
procedure TfmMain.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 Params.ExStyle :=  Params.ExStyle or WS_EX_APPWINDOW;
end;

этот код добавляет кнопку формы на панель задач.
а так же
procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
...
procedure TfmMain.WMSysCommand(var Message: TWMSysCommand);
begin
 if (Message.CmdType and $FFF0 = SC_MINIMIZE) and
   (Application.MainForm = Self) then
 begin
   if not IsIconic ( Handle) then
   begin
     Application.NormalizeTopMosts;
     SetActiveWindow(Handle);
     if (Application.MainForm <> nil) and (Application.ShowMainForm
       or Application.MainForm.Visible) and IsWindowEnabled( Handle) then
       DefWindowProc( Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
   end;
 end
 else
   if (Message.CmdType and $FFF0 <> SC_MOVE) or (csDesigning in
     ComponentState) or (Align = alNone) or (WindowState = wsMinimized) then
     inherited;
 if ((Message.CmdType and $FFF0 = SC_MINIMIZE) or
   (Message.CmdType and $FFF0 = SC_RESTORE)) and
   not (csDesigning in ComponentState) and (Align <> alNone) then
   RequestAlign;
end;

этот код позволяет правильно сворачивать окно.


Eraser   (2006-07-06 17:05:00) [11]

> Дома как раз D7, вечером попробую, отпишусь.

надеюсь найдете более красивое решение.


Eraser   (2006-07-06 17:04:00) [12]

> [24] Юрий Зотов ©   (06.07.06 16:54)

вроде бы проблему решил с помощю рекомендаций в
http://groups.google.com/group/borland.public.delphi.language.delphi.general/browse_thread/thread/788d4f62abeb33a2/99f6a238d3624fbb?hl=en
но ещё как следует не тестировал, скорее всего будут недочеты.

следует создать примерно такой модуль и присоединить его к проекту
unit AledensoftHintWindow;

interface

uses
 Windows, Controls, Messages, Forms;

type
 TAledensoftHintWindow = class(THintWindow)
 private
   FActivating: Boolean;
   FLastActive: Cardinal;
   procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
 public
   procedure ActivateHint(Rect: TRect; const AHint: String); override;
 end;

implementation

{ TMyHintwindow }

procedure TAledensoftHintWindow.ActivateHint(Rect: TRect; const AHint: String);
type
 TAnimationStyle = (atSlideNeg, atSlidePos, atBlend);
const
 AnimationStyle: array[TAnimationStyle] of Integer = (AW_VER_NEGATIVE,
   AW_VER_POSITIVE, AW_BLEND);
var
 Animate: BOOL;
 Style: TAnimationStyle;
begin
 FActivating := True;
 try
   Caption := AHint;
   Inc(Rect.Bottom, 4);
   UpdateBoundsRect(Rect);
   if Rect.Top + Height > Screen.DesktopHeight then
     Rect.Top := Screen.DesktopHeight - Height;
   if Rect.Left + Width > Screen.DesktopWidth then
     Rect.Left := Screen.DesktopWidth - Width;
   if Rect.Left < Screen.DesktopLeft then Rect.Left := Screen.DesktopLeft;
   if Rect.Bottom < Screen.DesktopTop then Rect.Bottom := Screen.DesktopTop;
   SetWindowPos(Handle, HWND_TOPMOST, Rect.Left, Rect.Top, Width, Height,
     SWP_NOACTIVATE);
   if (GetTickCount - FLastActive > 250) and (Length(AHint) < 100) and
      Assigned(AnimateWindowProc) then
   begin
     SystemParametersInfo(SPI_GETTOOLTIPANIMATION, 0, @Animate, 0);
     if Animate then
     begin
       SystemParametersInfo(SPI_GETTOOLTIPFADE, 0, @Animate, 0);
       if Animate then
         Style := atBlend
       else
         // Begin changes.
         if Mouse.CursorPos.Y > Rect.Top then
           Style := atSlideNeg
         // End changes.
         else
           Style := atSlidePos;
       AnimateWindowProc(Handle, 100, AnimationStyle[Style] or AW_SLIDE);
     end;
   end;
   // Begin changes.
   if Assigned(Screen.Activeform) then
     ParentWindow := Screen.Activeform.Handle
   else
     ParentWindow := Application.Handle;
   // End changes.
   ShowWindow(Handle, SW_SHOWNOACTIVATE);
   Invalidate;
 finally
   FLastActive := GetTickCount;
   FActivating := False;
 end;
end;

procedure TAledensoftHintWindow.CMTextChanged(var Message: TMessage);
begin
 if not FActivating then
   inherited;
end;

initialization
 HintWindowClass := TAledensoftHintWindow;
 
end.


Юрий Зотов   (2006-07-06 16:54:00) [13]

> Eraser ©   (06.07.06 16:34) [23]

Дома как раз D7, вечером попробую, отпишусь.


Eraser   (2006-07-06 16:34:00) [14]

чтобы мои заявления не звучали голословно, вот обсуждение схожей проблемы
http://groups.google.com/group/borland.public.delphi.nativeapi.win32/browse_thread/thread/f5cd2161d871edc9/d7e78910e68dfccf#d7e78910e68dfccf

Hi,
I had been overriding the create params method on on of my forms so it would
show up in the task bar and be parented to the desktop,(I did this so I
could open this particular form from a tray icon) this worked great in
Delphi 6,  a week ago I compiled it in D7 and the form that was parented to
the desktop started to have problems with it's tool bar hints, basicly if
you put the cursor over a tool bar button the hint fires and then brings the
main form to the top.
...


Юрий Зотов   (2006-07-06 16:20:00) [15]

Поставил bsSizeable - не выскакивает.


Eraser   (2006-07-06 16:18:00) [16]

> [19] Германн ©   (06.07.06 16:16)
> D6, XP

6, к сожалению, не установлена, вот бы на 7 и выше кто-нибудь протестил.


Eraser   (2006-07-06 16:17:00) [17]

> [18] Юрий Зотов ©   (06.07.06 16:15)


> и BorderStyle=bsToolWindow, чтоб в панели задач не висела

возможно в этом проблема, дело в том, что у меня была (и есть) необходимость как раз отображать кнопку на панели задач..


Германн   (2006-07-06 16:16:00) [18]

D6, XP
Не выскакивает никогда. :-(


Юрий Зотов   (2006-07-06 16:15:00) [19]

> Eraser ©   (06.07.06 15:59) [15]

> код второго модуля
Он уменя точно такой же, только еще caFree в OnClose (и BorderStyle=bsToolWindow, чтоб в панели задач не висела).

> при всех последующих появлениях хинта наблюдается
Ну не наблюдается у меня, ни при 1-м, ни при 21-м, ну что я могу сделать?.


Eraser   (2006-07-06 16:05:00) [20]

да! вот ещё одна особенность.
Создаю вторую форму, навожу на неё указатель мыши - появляется хинт. Все нормально, ничего никуда не прыгает, а вот при всех последующих появлениях хинта наблюдается указанный выше эффект.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо