AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Popup-Window wie Code Complete

Ein Thema von tyb · begonnen am 12. Sep 2007 · letzter Beitrag vom 17. Sep 2007
Antwort Antwort
Seite 1 von 2  1 2      
tyb

Registriert seit: 11. Jun 2007
7 Beiträge
 
#1

Popup-Window wie Code Complete

  Alt 12. Sep 2007, 14:33
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!
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Popup-Window wie Code Complete

  Alt 12. Sep 2007, 14:35
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
tyb

Registriert seit: 11. Jun 2007
7 Beiträge
 
#3

Re: Popup-Window wie Code Complete

  Alt 12. Sep 2007, 14:42
NoActivate (WS_EX_NOACTIVATE) habe ich versucht. Leider ändert es nichts an der Sache.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Popup-Window wie Code Complete

  Alt 12. Sep 2007, 14:53
wie? gar kein Unterschied? dann scheinst du etwas falsch zu machen. Denn es sollte dann nicht mehr aktiviert sein.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
tyb

Registriert seit: 11. Jun 2007
7 Beiträge
 
#5

Re: Popup-Window wie Code Complete

  Alt 12. Sep 2007, 14:58
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.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

Re: Popup-Window wie Code Complete

  Alt 12. Sep 2007, 15:21
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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Popup-Window wie Code Complete

  Alt 12. Sep 2007, 15:40
Versuch's mal mit THintWindow:
http://www.delphipraxis.net/internal...t.php?t=117444
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Popup-Window wie Code Complete

  Alt 12. Sep 2007, 18:07
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
tyb

Registriert seit: 11. Jun 2007
7 Beiträge
 
#9

Re: Popup-Window wie Code Complete

  Alt 12. Sep 2007, 22:30
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
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#10

Re: Popup-Window wie Code Complete

  Alt 12. Sep 2007, 22:44
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;
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz