[Delphi] Child window verschijnt als aparte app in taakbalk

Pagina: 1
Acties:

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-08 22:26

Tomatoman

Fulltime prutser

Topicstarter
In Delphi heb ik een component gebouwd rond de Windows-functies om een wizard te tonen. Die component, TWizard, is nu helemaal klaar, maar er is een probleem. De wizard moet als een child window van mijn applicatie verschijnen, maar wordt in werkelijkheid behandeld als een aparte applicatie. Hij staat als een aparte applicatie in de taakbalk. Bovendien werken functies zoals ShowMessage niet naar behoren. Zij tonen het venster als een child van het window dat zichtbaar was voordat TWizard werd aangeroepen.

Kortom, TWizard wordt blijkbaar niet aan de window list toegevoegd. En dat terwijl TWizard precies hetzelfde doet als wat TCommonDialog, TOpenDialog en dergelijke doen:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
var
  ActiveWizard: TWizard = nil;

function TWizard.TaskModalDialog(var Header: TPropSheetHeader): Integer;
type
  TDialogFunc = function(var DialogData): Bool stdcall;
var
  ActiveWindow: HWnd;
  WindowList: Pointer;
  FPUControlWord: Word;
  FocusState: TFocusState;
begin
  Result := 0;
  try
    ActiveWindow := GetActiveWindow;
    WindowList := DisableTaskWindows(0);
    FocusState := SaveFocusState;
    try
      Application.HookMainWindow(MessageHook);
      asm
        // Avoid FPU control word change in NETRAP.dll, NETAPI32.dll, etc
        FNSTCW  FPUControlWord
      end;
      try
        { In unit Dialogs heet de variabele ActiveWizard anders, namelijk
          CreationControl en is van het type TCommonDialog }
        ActiveWizard := Self; 
        Result := PropertySheet(Header);
      finally
        ActiveWizard := nil;
        asm
          FNCLEX
          FLDCW FPUControlWord
        end;
        Application.UnhookMainWindow(MessageHook);
      end;
    finally
      EnableTaskWindows(WindowList);
      SetActiveWindow(ActiveWindow);
      RestoreFocusState(FocusState);
    end;
  except
    Application.HandleException(Self);
  end;
end;
Hoe maak ik van mijn Wizard een child window?

Een goede grap mag vrienden kosten.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-08 22:26

Tomatoman

Fulltime prutser

Topicstarter
Ik zal er wat plaatjes bijzetten om het duidelijker te maken.

Het Options venster (voordat de wizard wordt gestart):
Afbeeldingslocatie: http://home.planet.nl/~robin.gerrets/linked/wizard_start.gif

Vanuit het Options venster kan de wizard worden gestart. Zodra de wizard verschijnt, is er een extra applicatie in de taakbalk. Op de screenshot ben ik al een paar pagina's op weg in de wizard.
Afbeeldingslocatie: http://home.planet.nl/~robin.gerrets/linked/wizard_wizard.gif

Nu roep ik vanuit de wizard een nieuw dialoogvenster aan. De wizard verdwijnt naar de achtergrond (alsof een andere applicatie actief wordt) en het dialoogvenster verschijnt als een popup van het Options venster.
Afbeeldingslocatie: http://home.planet.nl/~robin.gerrets/linked/wizard_popup.gif

Een goede grap mag vrienden kosten.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-08 22:26

Tomatoman

Fulltime prutser

Topicstarter
Ongelofelijk, de oplossing lijkt te simpel om waar te zijn. Na de initialisatie van de wizard (met Wnd als window handle) doe ik
Delphi:
1
SetWindowLong(Wnd, GWL_HWNDPARENT, Application.Handle);
en alles werkt naar behoren.

Een goede grap mag vrienden kosten.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

tomatoman schreef op 15 March 2003 @ 21:09:
Ongelofelijk, de oplossing lijkt te simpel om waar te zijn. Na de initialisatie van de wizard (met Wnd als window handle) doe ik
Delphi:
1
SetWindowLong(Wnd, GWL_HWNDPARENT, Application.Handle);
en alles werkt naar behoren.
Ja dat klopt :) Taskbar toont nl. toplevel unowned windows, dus simpelweg een owner toewijzen lost het op (niet zo ongelofelijk dus ;) )

Professionele website nodig?