将两个控件合二为一

时间:2009-12-18 15:59:50

标签: .net winforms .net-2.0 controls powerpacks

我想知道是否有可能(在视觉上和功能上)链接两个控件(组件)? (.NET2)

简化这些东西,我有两个标签 - 其中一个是主标签(可以用鼠标替换)和另一个 - 描述标签 - 它需要在指定距离上跟随主标签。

此外,描述标签应该能够响应事件,如鼠标点击等。 也许有可能使用 UserControl ,但在标签之间我需要成为一个“透明”的空间。

感谢。

==编辑1 ==

我也可以使用永恒工具提示,而不是创建第二个标签控件。在这种情况下,我想知道显示无限时间的可能性以及检测工具提示上的点击的可能性。

无论如何,如果我点击标签或工具提示,我将需要向用户显示一个TextBox 控件(而不是工具提示或标签),以便它能够修改显示的描述(实际上显示时间)

==编辑2 ==

alt text http://lh4.ggpht.com/_1TPOP7DzY1E/Sy9Mk8-Z-xI/AAAAAAAACzo/-5huzSd59j4/s800/UserControl.png

这是我的“transperent”UserControl设计

alt text http://lh5.ggpht.com/_1TPOP7DzY1E/Sy9MlM31jUI/AAAAAAAACzs/xIJ0hcgOzwo/s800/UserControlForm.png

这是我在运行模式下的表单(用户控件“透明”区域覆盖按钮)。

这是usercontrol的代码:

using System;
using System.Windows.Forms;
using System.Drawing;

namespace WindowsControlLibrary1
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x00000020;//WS_EX_TRANSPARENT
                return cp;
            }
        }

        private int opacity;
        public int Opacity
        {
            get { return opacity; }
            set
            {
                opacity = value;
                this.InvalidateEx();
            }
        }

        protected override void OnPaintBackground(PaintEventArgs e)
        {
            Color bk = Color.FromArgb(Opacity, this.BackColor);
            e.Graphics.FillRectangle(new SolidBrush(bk), e.ClipRectangle);
        }

        protected void InvalidateEx()
        {
            if (Parent == null)
                return;
            Rectangle rc = new Rectangle(this.Location, this.Size);
            Parent.Invalidate(rc, true);
        }

        private void label1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this.Location = this.Location + (Size)e.Location;
            }
        }

        Point cursorDownPoint = Point.Empty;
        private void label1_MouseDown(object sender, MouseEventArgs e)
        {
            cursorDownPoint = label1.PointToScreen(e.Location);
        }
    }
}

=================

*描述有点简化。在我的实际情况中,我有一个自定义循环点组件(:来自Microsoft.VisualBasic.PowerPacks.OvalShape)。该点表示时间位置的对象 - 在链接标签中我需要指定点的时间。用户可以通过单击时间标签来修改点的时间。

1 个答案:

答案 0 :(得分:2)

创建User Control。概述了透明度问题的解决方法here