![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дочерние окна при сворачивании главного
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]да! вот ещё одна особенность.
Создаю вторую форму, навожу на неё указатель мыши - появляется хинт. Все нормально, ничего никуда не прыгает, а вот при всех последующих появлениях хинта наблюдается указанный выше эффект.