Соедините два элемента управления в одном - PullRequest
1 голос
/ 18 декабря 2009

Интересно, есть ли возможность (визуально и функционально) связать два элемента управления (компоненты)? (.NET2)

Упрощенно, у меня есть две метки - одна из них является основной меткой (ее можно сместить мышью), а другая - меткой описания - она ​​должна следовать за основной меткой на указанном расстоянии.

Кроме того, метка описания должна быть в состоянии реагировать на события, такие как щелчок мыши и т. Д. Возможно, есть возможность использовать UserControl , но между метками мне нужно быть "прозрачным" пробелом.

Спасибо.

== РЕДАКТИРОВАТЬ 1 ==

Я также мог бы вместо создания второго элемента управления меткой просто использовать вечный подсказка . В этом случае меня интересует возможность отображения бесконечного времени, а также возможность определения щелчка по всплывающей подсказке.

В любом случае, если я нажму на метку или всплывающую подсказку, Мне потребуется отобразить пользователю элемент управления TextBox (вместо подсказки или метки), чтобы иметь возможность изменять отображаемую описание (фактически отображающее время)

== РЕДАКТИРОВАТЬ 2 ==

альтернативный текст http://lh4.ggpht.com/_1TPOP7DzY1E/Sy9Mk8-Z-xI/AAAAAAAACzo/-5huzSd59j4/s800/UserControl.png

это мой "прозрачный" дизайн UserControl

альтернативный текст http://lh5.ggpht.com/_1TPOP7DzY1E/Sy9MlM31jUI/AAAAAAAACzs/xIJ0hcgOzwo/s800/UserControlForm.png

и это моя форма в режиме работы (пользовательский элемент управления "прозрачная" область, покрывающая кнопку).

это код пользовательского контроля:

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 Ответ

2 голосов
/ 18 декабря 2009

Создать Пользовательский элемент управления . Обходное решение проблемы прозрачности изложено здесь .

...