Delphi-PRAXiS
Seite 1 von 2  1 2      

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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:10 Uhr.
Seite 1 von 2  1 2      

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