我想为我的多行文本框实现类似intellisense的功能。 intellisense控件以标准形式放置,没有控制盒(因此,没有标题或最大化/最小化底部可见)。
一切正常,但如果显示intellisense-form并且用户点击了intellisense表单,则主表单失去焦点(因此,用户必须单击回文本框才能写入)。
我知道ShowWithoutActivation
属性,但它仅适用于激活,而不适用于“标准焦点”。
修改
我在http://www.daniweb.com/software-development/csharp/threads/273724找到了帮助,但提供的代码不起作用。它在“Show()”方法中抛出“Invalid parameter”异常。
答案 0 :(得分:9)
要显示未激活的表单,请覆盖ShowWithoutActivation属性
protected override bool ShowWithoutActivation
{
get { return true; }
}
如果您不想在鼠标点击时激活表单,请覆盖CreateParams并设置这些样式
protected override CreateParams CreateParams
{
get
{
CreateParams p = base.CreateParams;
p.Style |= 0x40000000; // WS_CHILD
p.ExStyle |= 0x8000000; // WS_EX_NOACTIVATE - requires Win 2000 or higher :)
return p;
}
}
答案 1 :(得分:1)
我有一天从代码项目(我认为)下载代码,我不知道原始下载链接尝试使用此
using System;
using System.Drawing;
using System.Windows.Forms;
namespace Balloon.NET
{
public class BalloonWindow : Form
{
public static readonly int TIPMARGIN;
public static readonly int TIPTAIL;
public BalloonWindow();
public Point AnchorPoint { get; set; }
public BalloonWindow.BallonQuadrant Quadrant { get; }
public static Point AnchorPointFromControl(Control anchorControl);
protected override void Dispose(bool disposing);
protected override void OnLoad(EventArgs e);
protected virtual Rectangle OnNCCalcSize(Rectangle windowRect);
protected virtual void OnNCPaint(Graphics g);
protected override void OnResize(EventArgs e);
protected void RecalcLayout();
protected void RepositionWindow(Point oldAnchorPoint, Point newAnchorPoint);
public void ShowBalloon(Control anchorControl);
protected override void WndProc(ref Message m);
public enum BallonQuadrant
{
TopLeft = 0,
TopRight = 1,
BottomLeft = 2,
BottomRight = 3,
}
}
}
并使用以下表格
Balloon.NET.BalloonWindow ms = new Balloon.NET.BalloonWindow();
private void numberEdit1_TextChanged(object sender, EventArgs e)
{
if (!ms.Visible)
{
ms.ShowBalloon(numberEdit1);
numberEdit1.Focus();
}
}
答案 2 :(得分:0)
我找到了解决方案:Creating a Form That Doesn't Take Focus。