![]() |
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:10 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