我正在使用表单来显示通知(它出现在屏幕的右下角),但是当我显示此表单时,它会从主表单中窃取焦点.有没有办法在不窃取焦点的情况下显示此"通知"表单?
如何使用Delphi 创建"下拉"窗口?
超越这一点的一切都是研究工作; 并且与答案无关.
做一个适当的下拉需要很多部分仔细一起工作.我假设人们不喜欢这个棘手的问题,我宁愿问七个不同的问题; 每一个都解决了一小部分问题.接下来的一切都是我为解决这个看似简单的问题所做的研究工作.
请注意下拉窗口的定义特征:

这是我在WinForms中询问的同一问题的Delphi变体:
WinForms的答案是使用ToolStripDropDown class.它是一个帮助类,可以将任何形式转换为下拉列表.
我将首先创建一个华而不实的下拉表单,作为示例:

接下来我将删除一个按钮,这将是我点击以显示下拉列表的内容:

最后,我将连接一些初始代码,以显示它在OnClick中需要的形式:
procedure TForm3.Button1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
frmPopup: TfrmPopup;
pt: TPoint;
begin
frmPopup := TfrmPopup.Create(Self);
//Show the form just under, and right aligned, to this button
pt := Self.ClientToScreen(Button1.BoundsRect.BottomRight);
Dec(pt.X, frmPopup.ClientWidth);
frmPopup.Show(Self, Self.Handle, pt);
end;
Run Code Online (Sandbox Code Playgroud)
编辑:将其更改为MouseDown而不是Click.单击不正确,因为显示下拉列表而无需单击.其中一个未解决的问题是如果用户再次按下按钮,如何 …
如何创建超出其区域范围的C#Winforms控件?比如一个下拉框.有点像你在小尺寸面板中有一个DropDownBox.
我正在尝试使用类似于组合框的功能实现.net表单控件,但我不知道在表单上的任何位置拦截鼠标事件以取消扩展项目列表的正确方法.
在显示列表时,如何防止其他控件响应鼠标事件?
如何高效安全地将鼠标单击事件捕获到表单上的任何位置,以隐藏扩展列表?
我试图模拟ComboBox下拉列表的行为(或其他下拉菜单的行为,包括上下文菜单),当您点击其他任何地方时,下拉关闭,即使在无法聚焦的事情上也是如此.
我已经尝试订阅MouseCaptureChanged,LostFocus和Leave等事件.我有一个自定义UserControl作为下拉列表,我只想在用户点击其他任何地方时关闭它.
这似乎是在许多控件中完成的事情,所以如果没有一个简单的方法,我会感到惊讶.
到目前为止,我可以提出的过于复杂的方法是使用pinvoke和SetCapture()函数,或者创建一个MessageFilter.如果这些是唯一的选择,我不确定哪个更好.
我如何制作,我将称之为"WinForms中的"弹出窗口"?
由于我使用了自己的单词"popup",让我举一个这个所谓的"弹出窗口"窗口的例子:
一个提示窗口(可在其母体形式的边界之外延伸,不会出现在任务栏,不是模态,并且不偷焦点):

一个弹出菜单窗口(可以扩展到其父窗体的边界之外,不会出现在任务栏中,不是模态的,也不会偷取焦点):

一个下拉窗口(可以在其父窗体的边界之外延伸,不会出现在任务栏中,不是模态的,也不会偷取焦点):

甲主菜单窗口(可在其母体形式的边界之外延伸,不会出现在任务栏,不是模态,并且不偷焦点):

更新一个弹出窗口,不会让自己的"活动"窗口时,使用鼠标或键盘交互("所有者"窗口保持活动窗口):

我在这个神秘的"弹出窗口"中寻找的属性是:
Windows应用程序已经设法创建这样的窗口.我怎么能在WinForms应用程序中执行此操作?
Control可以作为我的弹出窗口?我试过这个Show(onwer) + ShowWithoutActivation方法:
PopupForm dd = new PopupForm ();
dd.Show(this);
Run Code Online (Sandbox Code Playgroud)
使用PopupForm:
public class PopupForm: Form
{
public PopupForm() …Run Code Online (Sandbox Code Playgroud)