没有焦点/激活的窗体



我想为我的多行文本框实现类似intellisense的功能。intellisense控件以标准形式放置,没有控制框(因此,没有标题或最大化/最小化按钮可见)。

所有操作都很好,但如果显示了intellisense表单,并且用户单击了intellisSense表单,则主表单将失去焦点(因此,用户必须单击回文本框进行编写)。

我知道ShowWithoutActivation属性,但它只适用于激活,而不适用于"标准焦点"。

编辑:

我在上找到了帮助http://www.daniweb.com/software-development/csharp/threads/273724,但所提供的代码不起作用。它在"Show()"方法期间抛出"Invalid parameter"异常。

要在不激活的情况下显示表单,请重写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;
  }
}

我有一个代码,我从代码项目下载了几天(我想),我不知道最初的下载链接是什么,试着使用这个

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();
    }
}

最新更新