![]() |
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:
So schwebt mein Control zwar, jedoch akzeptiert es keine Klicks mehr.
procedure TMyPopupWindow.CreateParams(var params: TCreateParams);
begin inherited; Params.WndParent := GetDesktopWindow; end; Danke für jeden Tip! |
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.
|
Re: Popup-Window wie Code Complete
NoActivate (WS_EX_NOACTIVATE) habe ich versucht. Leider ändert es nichts an der Sache.
|
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.
|
Re: Popup-Window wie Code Complete
Okay, bei einer Form geht's mit dem Code hier (im Forum gefunden)
Delphi-Quellcode:
versuche mal den Unterschied zu meinem Control zu finden ;)
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); Danke schon mal. |
Re: Popup-Window wie Code Complete
Der Unterschied liegt bei dem Control, siehe msdn:
Zitat:
|
Re: Popup-Window wie Code Complete
|
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.
|
Re: Popup-Window wie Code Complete
Ich habe momentan folgendes:
Delphi-Quellcode:
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?
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; Danke |
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; |
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 ;)
|
Re: Popup-Window wie Code Complete
Zitat:
|
Re: Popup-Window wie Code Complete
Wenn niemand weiss wie - Kennt jemand vielleicht ein Projekt mit Source, wo ich nachschauen könnte?
|
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!
|
Re: Popup-Window wie Code Complete
Zitat:
![]() HTH, Uli. |
Re: Popup-Window wie Code Complete
Bei dem CNPack gibt es doch auch so ein Fenster. Schau Dir doch den Code mal an
|
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. |
Re: Popup-Window wie Code Complete
Zitat:
|
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