2011-06-13 74 views
1

我想为我的多行文本框实现智能感知功能。智能感应控件置于没有控制框的标准形式(所以,没有标题或最大化/最小化bottons是可见的)。没有焦点/激活的表单

所有工作正常,但如果显示的智能感知形式和用户点击进入智能感知形式,主要形式失去焦点(因此,用户必须重新点击文本框写入)。

我知道ShowWithoutActivation属性,但它仅适用于激活,而不是“标准的重点”。

编辑:

我发现http://www.daniweb.com/software-development/csharp/threads/273724的帮助,但所提出的代码不能正常工作。它在“Show()”方法中抛出“Invalid parameter”异常。

+0

为什么你不使用控件而不是表单来处理intellisense? – Saleh 2011-06-13 10:16:56

+0

因为客户想要智能感知形式可以从主窗体溢出。 – TcKs 2011-06-13 10:19:40

+0

显然你的'智能感知控制'不是一个控件。很不可思议的是它究竟是一种什么样的动物。如果它是一个Form,那么将其TopLevel属性设置为false以将其转换为控件。 – 2011-06-13 12:31:15

回答

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

它看起来有用,我就试试吧。谢谢! – TcKs 2011-06-13 20:05:43

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; 
    } 
} 
+0

扩展风格是int,所以这并不编译上最近的.NET版本,最后一个关于调整CreateParams的建议,即使修改为编译,也不起作用,你只需要“创建窗口句柄的错误”Win32Exception – user3690202 2016-07-25 03:40:16