1
我想创建一个应该处于非活动状态且具有键盘输入焦点的下拉控件。所以我创建了如下的控件。如何使用keybord焦点创建非活动下拉列表
public class DropDownEdit : UserControl
{
[DllImport("user32.dll")]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
private const int WS_EX_TOOLWINDOW = 0x00000080;
private const int WS_EX_TOPMOST = 0x00000008;
private const int WS_EX_NOACTIVATE = 0x08000000;
private const int WS_CHILD = 0x40000000;
private const int WS_POPUP = unchecked((int)0x80000000);
private TextBox text = new TextBox();
public DropDownEdit()
{
this.BackColor = Color.FromArgb(44, 68, 107);
this.Controls.Add(text);
this.Margin = Padding.Empty;
this.Padding = new Padding(0);
text.Multiline = true;
text.ScrollBars = ScrollBars.Both;
text.Size = new Size(this.Width, this.Height);
}
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.Style &= ~WS_CHILD;
createParams.Style |= WS_POPUP;
createParams.ExStyle |= WS_EX_TOOLWINDOW;
createParams.ExStyle |= WS_EX_TOPMOST;
createParams.ExStyle |= WS_EX_NOACTIVATE;
return createParams;
}
}
public void ShowWindow(Point point)
{
text.Focus();
this.Capture = true;
SetParent(this.Handle, IntPtr.Zero);
this.Location = point;
Show();
}
protected override void OnMouseCaptureChanged(EventArgs e)
{
base.OnMouseCaptureChanged(e);
this.Hide();
}
}
,当我下面显示上述下拉窗口,
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Point point = this.PointToScreen(button1.Location);
DropDownEdit window = new DropDownEdit();
window.ShowWindow(new Point(point.X, point.Y + 20));
}
}
的Form1
有闪烁的现象,同时显示DropDownEdit
。我认为DropDownEdit
被激活,Form1
失去激活。如何避免Form1
中的闪烁现象?
注意: - 我需要关注下拉控件中的TextBox
。
您是否已将Form1的'DoubeBuffered'属性设置为'True'? – LInsoDeTeh
@LInsoDeTeh其实这不是一个画相关的闪烁。这里闪烁意味着我的下拉窗口变成了活动窗口,即使它具有'WS_EX_NOACTIVATE'风格。所以'Form1'有一个眨眼的效果,并没有用'DoubeBuffered'做什么。 – Kaizen