Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Popup-Window wie Code Complete (https://www.delphipraxis.net/99462-popup-window-wie-code-complete.html)

tyb 12. Sep 2007 15:33


Popup-Window wie Code Complete
 
Hallo

Ich möchte ein Fenster-Control schreiben, welches von der MainForm losgelöst ist, beim Aktivieren jedoch den Fokus der Form nicht wegnimmt.

Dieses Verhalten sieht man beim Auto Complete Fenster in Delphi: Wenn man Ctrl-Leertaste drückt, sieht man ein Control, welches über den Fensterrand ragen kann. Diese Liste kann mit einem Klick aktiviert werden, man kann scrollen, Einträge auswählen, etc., dabei bleibt das dahinterliegende Fenster (Quelltexteditor) aber immer aktiv.

Wie erzeuge ich so ein schwebendes Fenster, welches den Fokus nicht stiehlt?

Ich habe bisher schon versucht, CreateParams zu überschreiben und dort WndParent auf den DesktopWindow zu setzen:
Delphi-Quellcode:
procedure TMyPopupWindow.CreateParams(var params: TCreateParams);
begin
  inherited;
  Params.WndParent := GetDesktopWindow;
end;
So schwebt mein Control zwar, jedoch akzeptiert es keine Klicks mehr.

Danke für jeden Tip!

SirThornberry 12. Sep 2007 15:35

Re: Popup-Window wie Code Complete
 
Sowas kann man mit Forms und dem entsprechenden Style (noActivate oder so ähnlich) erreichen. Die Lösung wurde mal im Zusammenhang mit einer Bildschirmtastatur erwähnt welche ja auch nicht den Focus von der anderen Anwendung nehmen soll.

tyb 12. Sep 2007 15:42

Re: Popup-Window wie Code Complete
 
NoActivate (WS_EX_NOACTIVATE) habe ich versucht. Leider ändert es nichts an der Sache.

SirThornberry 12. Sep 2007 15:53

Re: Popup-Window wie Code Complete
 
wie? gar kein Unterschied? dann scheinst du etwas falsch zu machen. Denn es sollte dann nicht mehr aktiviert sein.

tyb 12. Sep 2007 15:58

Re: Popup-Window wie Code Complete
 
Okay, bei einer Form geht's mit dem Code hier (im Forum gefunden)

Delphi-Quellcode:
  SetWindowLong(handle, GWL_EXSTYLE,GetWindowLong(handle, GWL_EXSTYLE) or WS_EX_NOACTIVATE);
  SetWindowPos(Handle, HWND_NOTOPMOST + WORD(true), 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
versuche mal den Unterschied zu meinem Control zu finden ;)

Danke schon mal.

jfheins 12. Sep 2007 16:21

Re: Popup-Window wie Code Complete
 
Der Unterschied liegt bei dem Control, siehe msdn:
Zitat:

Windows 2000/XP: A top-level window created with this style does not become the foreground window when the user clicks it.

shmia 12. Sep 2007 16:40

Re: Popup-Window wie Code Complete
 
Versuch's mal mit THintWindow:
http://www.delphipraxis.net/internal...t.php?t=117444

SirThornberry 12. Sep 2007 19:07

Re: Popup-Window wie Code Complete
 
Ein HintWindow kann man aber nicht klicken was jedoch beim Codevervollständigungsfenster etc. geht. Grund ist das dort der Style so ist das klicks etc. an das Fenster des gleichen Prozesses welches dahinter liegt durchgereicht werden.

tyb 12. Sep 2007 23:30

Re: Popup-Window wie Code Complete
 
Ich habe momentan folgendes:
Delphi-Quellcode:
type
  TPanelEx = class(TPanel)
  public
    constructor Create(AOwner: TComponent); override;
    procedure CreateParams(var Params: TCreateParams); override;
  end;

{ TPanelEx }

constructor TPanelEx.Create(AOwner: TComponent);
begin
  inherited;
  SetWindowLong(handle, GWL_EXSTYLE,GetWindowLong(handle, GWL_EXSTYLE) or WS_EX_NOACTIVATE);
  SetWindowPos(Handle, HWND_NOTOPMOST + WORD(true), 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
end;

procedure TPanelEx.CreateParams(var Params: TCreateParams);
begin
  inherited;
  with Params do
  begin
    Style := WS_POPUP or WS_BORDER;
    WindowClass.Style := WindowClass.Style or CS_SAVEBITS;
    if NewStyleControls then
      ExStyle := WS_EX_TOOLWINDOW;
    if NewStyleControls then ExStyle := WS_EX_TOOLWINDOW;
    AddBiDiModeExStyle(ExStyle);
    ParentWindow := GetDesktopWindow;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Panel: TPanelEx;
begin
  Panel := TPanelEx.Create(nil);
  ShowWindow(Panel.Handle, SW_SHOW);
end;
Dieses PanelEx stiehlt den Fokus von anderen Fenstern von anderen Programmen nicht (wie gewünscht). Jedoch stiehlt es den Fokus vom MainForm. Das darf natürlich auch nicht sein. Es funktioniert also überall, ausser beim MainForm. Hat jemand eine Ahnung an was das liegen könnte?

Danke

Mackhack 12. Sep 2007 23:44

Re: Popup-Window wie Code Complete
 
Delphi-Quellcode:
type
  TDemoForm = class(TForm)
    Memo: TMemo;
    XPManifest: TXPManifest;
    ListBox: TListBox;
    procedure MemoKeyPress(Sender: TObject; var Key: Char);
    procedure ListBoxKeyPress(Sender: TObject; var Key: Char);
    procedure MemoEnter(Sender: TObject);
    procedure ListBoxDblClick(Sender: TObject);
  private
    procedure MemoCatch;
  end;

var
  DemoForm: TDemoForm;

implementation

{$R *.dfm}

procedure TDemoForm.MemoCatch;
begin
  with ListBox do
    Memo.SelText := Items[ItemIndex];
  Memo.SetFocus;
end;

procedure TDemoForm.MemoKeyPress(Sender: TObject; var Key: Char);
var
  pt: TPoint;
begin
  if Key <> '.' then
    Exit;
  GetCaretPos(pt);
  with ListBox do
  begin
    Left := pt.X + 6;
    Top := pt.Y - Memo.Font.Height * 6 div 5;
    ItemIndex := 0;
    Visible := true;
    SetFocus;
  end;
end;

procedure TDemoForm.ListBoxKeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
    Chr(VK_RETURN):
      MemoCatch;
    Chr(VK_ESCAPE):
      Memo.SetFocus;
  end;
end;

procedure TDemoForm.MemoEnter(Sender: TObject);
begin
  Listbox.Visible := false;
end;

procedure TDemoForm.ListBoxDblClick(Sender: TObject);
begin
  MemoCatch;
end;

tyb 13. Sep 2007 07:53

Re: Popup-Window wie Code Complete
 
@Mackhack: Ich möchte ein Floating Window, das den Fokus des MainForms nicht stiehlt. Ist ja schön, wenn du Code postest, aber es hat nicht viel damit zu tun, was ich beschrieben habe ;)

Mackhack 13. Sep 2007 07:56

Re: Popup-Window wie Code Complete
 
Zitat:

Zitat von tyb
@Mackhack: Ich möchte ein Floating Window, das den Fokus des MainForms nicht stiehlt. Ist ja schön, wenn du Code postest, aber es hat nicht viel damit zu tun, was ich beschrieben habe ;)

Wohl ueberlesen :twisted:

tyb 16. Sep 2007 20:17

Re: Popup-Window wie Code Complete
 
Wenn niemand weiss wie - Kennt jemand vielleicht ein Projekt mit Source, wo ich nachschauen könnte?

Mackhack 17. Sep 2007 05:51

Re: Popup-Window wie Code Complete
 
Du koenntst vlt. mal den Code vom TFindDialog ansehen. Der muesste doch das machen was du willst denn dieser Dialog ist im Prinzip modal aber du kannst weiterhin auch wenn er sichtbar ist z. B. ins Memo klicken und dort arbeiten!

uligerhardt 17. Sep 2007 08:58

Re: Popup-Window wie Code Complete
 
Zitat:

Zitat von tyb
Wenn niemand weiss wie - Kennt jemand vielleicht ein Projekt mit Source, wo ich nachschauen könnte?

Schau doch mal hier.

HTH,
Uli.

v2afrank 17. Sep 2007 09:55

Re: Popup-Window wie Code Complete
 
Bei dem CNPack gibt es doch auch so ein Fenster. Schau Dir doch den Code mal an

tyb 17. Sep 2007 10:15

Re: Popup-Window wie Code Complete
 
@uligerhardt: Danke aber wenn ich das Popup anklicke geht der Fokus des Parent-Fensters weg.
CNPack werd ich mal anschauen.

uligerhardt 17. Sep 2007 11:09

Re: Popup-Window wie Code Complete
 
Zitat:

Zitat von tyb
@uligerhardt: Danke aber wenn ich das Popup anklicke geht der Fokus des Parent-Fensters weg.

<Bernd>Mist!</Bernd> :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz