Форум: "Основная";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
ВнизДочерние окна при сворачивании главного Найти похожие ветки
← →
RDS © (2006-07-05 16:54) [0]Программа создает массив дочерних окон. Как можно следать, чтобы при сворачивании главного окна программы, дочерние окна оставались на экране.
← →
Юрий Зотов © (2006-07-06 10:51) [1]Программа MDI?
← →
RDS © (2006-07-06 10:55) [2]Главное окно программы имеет FormStyle=fsNormal. Это имелось в виду?
← →
RDS © (2006-07-06 10:59) [3]Поставил в главном окне FormStyle=fsMDIForm. Результат тот же самый. При сворачивании главного окна сворачиваются и дочерние.
← →
Юрий Зотов © (2006-07-06 11:14) [4]Верните FormStyle=fsNormal и поясните - если программа не MDI, то что Вы имеете в виду под словами "дочерние окна"? ParentWindow? Что-то еще?
← →
RDS © (2006-07-06 11:24) [5]Под дочерними окнами я понимаю окна, создаваемые главным окном программы. Возможно формулировка не точная, но как это назвать по другому я не знаю.
← →
Jeer © (2006-07-06 11:38) [6]Такова функциональность взаимодействия главного и дочерних окон неважно какой (MDI или SDI) режим выбран.
← →
Юрий Зотов © (2006-07-06 11:52) [7]procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := HWND_DESKTOP
end;
← →
Jeer © (2006-07-06 11:54) [8]А в принципе - можно.
Отлавливать минимизацию главного и на нее ShowWindow(hChild, SW_SHOW)
← →
StriderMan © (2006-07-06 12:04) [9]
> и на нее ShowWindow(hChild, SW_SHOW)
сомнительно, что это будет работать. скорее всего главная форма тоже подымется
← →
Jeer © (2006-07-06 12:05) [10]работает
← →
Eraser © (2006-07-06 13:34) [11]> [7] Юрий Зотов © (06.07.06 11:52)
только здесь появится один неприятный глюк, при появлении любого хинта, главная форма приложения будет "выскакивать" на передний план.
как с этим бороться - не знаю, какое-то решение видел в группах google, но оно тоже было глючным. Если знаете правильное решение - дайте знать пожалуйста.
← →
Юрий Зотов © (2006-07-06 15:35) [12]> Eraser © (06.07.06 13:34) [11]
Проверил. Ничего никуда не выскакивает (XP, D6).
← →
Eraser © (2006-07-06 15:41) [13]> [12] Юрий Зотов © (06.07.06 15:35)
ну как же не выскакивает?
Пример на Д2006, на Д7 тоже самое.
Проект из двух форм. На первой форме только 1 кнопка, на второй установлено свойство ShowHint = true и св-во Hint = "test"unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
TForm2.Create(Application).Show;
end;
end.
при появлении хинта на 2 форме - 1 форма выскакивает на foreground.
← →
Юрий Зотов © (2006-07-06 15:57) [14]> Eraser © (06.07.06 15:41) [13]
Проверил еще раз. Все делал ТОЧНО как Вы сказали. Не выскакивает.
← →
Eraser © (2006-07-06 15:59) [15]> [14] Юрий Зотов © (06.07.06 15:57)
я забыл код второго модуля привестиunit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 = class(TForm)
protected
procedure CreateParams(var Params: TCreateParams); override;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
{ TForm2 }
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WndParent := HWND_DESKTOP;
end;
end.
← →
Eraser © (2006-07-06 15:59) [16]просьба к форумчанам, кто читает эту ветку, если не лень - протестируйте данный код, пожалуйста.
← →
Eraser © (2006-07-06 16:05) [17]да! вот ещё одна особенность.
Создаю вторую форму, навожу на неё указатель мыши - появляется хинт. Все нормально, ничего никуда не прыгает, а вот при всех последующих появлениях хинта наблюдается указанный выше эффект.
← →
Юрий Зотов © (2006-07-06 16:15) [18]> Eraser © (06.07.06 15:59) [15]
> код второго модуля
Он уменя точно такой же, только еще caFree в OnClose (и BorderStyle=bsToolWindow, чтоб в панели задач не висела).
> при всех последующих появлениях хинта наблюдается
Ну не наблюдается у меня, ни при 1-м, ни при 21-м, ну что я могу сделать?.
← →
Германн © (2006-07-06 16:16) [19]D6, XP
Не выскакивает никогда. :-(
← →
Eraser © (2006-07-06 16:17) [20]> [18] Юрий Зотов © (06.07.06 16:15)
> и BorderStyle=bsToolWindow, чтоб в панели задач не висела
возможно в этом проблема, дело в том, что у меня была (и есть) необходимость как раз отображать кнопку на панели задач..
← →
Eraser © (2006-07-06 16:18) [21]> [19] Германн © (06.07.06 16:16)
> D6, XP
6, к сожалению, не установлена, вот бы на 7 и выше кто-нибудь протестил.
← →
Юрий Зотов © (2006-07-06 16:20) [22]Поставил bsSizeable - не выскакивает.
← →
Eraser © (2006-07-06 16:34) [23]чтобы мои заявления не звучали голословно, вот обсуждение схожей проблемы
http://groups.google.com/group/borland.public.delphi.nativeapi.win32/browse_thread/thread/f5cd2161d871edc9/d7e78910e68dfccf#d7e78910e68dfccfHi,
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:54) [24]> Eraser © (06.07.06 16:34) [23]
Дома как раз D7, вечером попробую, отпишусь.
← →
Eraser © (2006-07-06 17:04) [25]> [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.
← →
Eraser © (2006-07-06 17:05) [26]> Дома как раз D7, вечером попробую, отпишусь.
надеюсь найдете более красивое решение.
← →
Eraser © (2006-07-06 22:01) [27]преведенный мной в [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;
этот код позволяет правильно сворачивать окно.
← →
ViK © (2006-07-07 04:59) [28]У меня была подобная проблема, TUser посоветовал: "Не делать сворачиваемое окно главным."
Вроде бы все работает, и не надо никаких особых обработчиков
← →
Юрий Зотов © (2006-07-07 09:12) [29]> Eraser
Проверил с D7 и XP SP2 - точно, есть такой эффект.
← →
Юрий Зотов © (2006-07-07 10:07) [30]> 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;
← →
Eraser © (2006-07-07 16:24) [31]> [30] Юрий Зотов © (07.07.06 10:07)
хитрый способ :) спасибо, буду иметь ввиду.
← →
Юрий Зотов © (2006-07-07 19:14) [32]> Eraser © (07.07.06 16:24) [31]
Только надо иметь в виду, что код в [30] - это пример, а не готовое решение. Пример работает, если при показе хинта мышь находится над самой формой TForm2, но он не сработает, если мышь находится над каким-то из лежащих на ней контролов. Чтобы он сработал, в любом случае, нужно сначала с помощью FindControl сначала получить этот контрол (как в примере), затем проверить его на nil и получить форму, на которой он лежит (что-то типа GetParentForm) - вот ее класс уже и сравнивать с TForm2.
← →
Eraser © (2006-07-07 19:28) [33]> [32] Юрий Зотов © (07.07.06 19:14)
да это я понял )
но мысль понятна.
← →
!_SM_! (2006-07-07 23:52) [34]
> Юрий Зотов © (07.07.06 09:12) [29]
> > Eraser
>Проверил с D7 и XP SP2 - точно, есть такой эффект.
У меня D7 и XP SP2 - НЕТ такого эффекта. Все нормально, при появлении hint"a на второй форме, первая никуда ни выскакивает....
Дело наверное не в сочетании D и Win....
← →
Eraser © (2006-07-08 01:37) [35]> [34] !_SM_! (07.07.06 23:52)
не забыли во второй форме перекрыть CreateParams?
← →
!_SM_! (2006-07-08 16:31) [36]
> Eraser © (08.07.06 01:37) [35]
Нет, не забыл ...
только вот без этого делал - WMWindowPosChanging
На панеле задач для каждой формы своя панелька.
И свернув первую(главную), при появлении хинта на второй, первая не разворачивается. и ничего особого не происходит хинт отоброжается, прячется...отоброжается...прячется... вообщем первая лежит на "панеле"
пока по ней не "щелкнешь"... ВОТ.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.043 c